2012-04-07 83 views
0

你能幫助我嗎? 我實現的執行和scheduledWithFixedDelay,但它確實只有一次.... 我希望做這個任務在重複的方式...Android重複任務不起作用

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
    executor.scheduleWithFixedDelay(new Runnable(){ 

     public void run() { 
      updateList(); 
     } 

    }, updateTime, updateTime, TimeUnit.MINUTES); 

我在做什麼錯?

在此先感謝。

+0

請注意,[''TimeUnit.MINUTES'不保證在Android上存在](http://stackoverflow.com/questions/3472423/android-java-util-concurrent-timeunit-convert-milliseconds-to-minutes) – 2014-01-31 16:34:31

回答

0

看起來您正在以正確的方式進行操作。 這使我在Java文檔閱讀,這裏是我發現我發現自己令人驚訝。

如果任務的任何執行遇到異常,則後續的 執行被禁止。

ScheduledExecutorService.scheduleWithFixedDelay()

有一個機會,在可運行的代碼生成了異常,這將導致的安排執行程序終結執行?當然你會提到這個?

但正如我所說,我發現這令人驚訝的閱讀,因爲我認爲計劃執行程序處理異常,以便後續任務執行不被抑制。而這是首選的主要原因之一,而不是典型的Timer。但現在我在javadoc中看到我顯然認爲是錯誤的...

我對Android平臺不太瞭解,但也許Oracle JVM和Android的Dalvik之間的java.util.concurrent工具有所不同,所以考慮到畢竟,Oracle的JVM javadoc可能不是一個好主意。

編輯: 事實上,工廠方法的javadoc說

(但請注意,如果此單個線程關閉前的執行期間終止由於故障 ,一個新的將取代其位置,如果 需要執行後續任務)

Executors.newSingleThreadScheduledExecutor()

EDIT2:Oracle和Dalvik的java doc似乎幾乎沒有區別。

+0

updateList方法可能會遇到異常,但所有可能的異常都是使用try和catch處理的。 – user1238516 2012-04-08 12:41:37

+0

如果你嘗試在Runnable中使用一個非常簡單的邏輯,就像system.out.println(「剛剛在」+ new Date()中執行)一樣。你也可以嘗試使用ScheduledExecutorService.newScheduledThreadPool(int corePoolSize)來查看行爲是否有任何不同。 – Svilen 2012-04-08 13:39:54

+0

我知道現在的問題是什麼。在我的方法updateList()中,我寫了notifyDataSetChanged()。這應該「通知」數據手中數據發生了變化。但在我的代碼中使用這種方法,「任務」永遠不會停止,所以它不能再次啓動.... – user1238516 2012-04-08 17:29:22