2013-10-29 89 views
2

一個TimerTask的GUI全球範圍內,我有以下幾點:更新使用處理程序

Timer timer = new Timer();

在我的onResume()我有以下代碼。

timer.schedule(new syncTimerTask(), 1, 30000);

和我syncTimerTask如下:

class syncOutgoingUpdatesTimerTask extends TimerTask 
{ 
    public void run() 
    { 
    //some sync process with outer back end server 
    //fetch results etc 

    myHandler.post(myRunnable); 
    } 
} 

我的處理程序和可運行的全局聲明如下

final Handler myHandler = new Handler(); 

final Runnable myRunnable = new Runnable() 
{ 
    public void run() 
    { 
     //update GUI, text views whatever. 
    } 
}; 

而我的onPause()我叫timer.cancel();

上面的代碼是nea t,直截了當,完美地完成工作。 但爲了更好地把握這個想法,我有一些擔憂和問題。

  1. 假設同步太多時間,並且用戶按下後退按鈕。這將導致onPause被引起,這將停止定時器重複自身,但是正在運行的TimerTask將繼續運行。但是當代碼到達myHandler.post(myRunnable);那一行處理程序調用runnable時會發生什麼情況,但是沒有更新的GUI?我在那裏得到一個空指針嗎?
  2. 假設同步開始並且又花了很多時間,在這種狀態下,用戶按下主頁按鈕並退出應用程序,並從'最近的應用程序'中刪除應用程序,'殺死'應用程序,調用所有方法上的onDestroy()。在這種情況下,計時器的線程(它是一個單獨的線程而不是UI線程)是否停止在哪裏(即使它可能在中間),因爲它與應用程序相關聯?),假設這是真的,代碼甚至不會到達myHandler.post(myRunnable);,所以不會出現空指針。是這種情況嗎?
+0

使用相同的潛在問題'runOnUIThread'爲什麼,如果你想重複一些任務 – Raghunandan

+0

@Raghunandan不只是處理程序runOnUIThread有時會引起我的問​​題。我不能只使用處理程序,因爲我正在執行網絡任務。該處理器將在UI線程上運行(因爲我創造它那裏).. – tony9099

+0

爲什麼不使用的AsyncTask它更容易使用 – Raghunandan

回答

0
  1. 是,該事件將運行,如果你廢掉的東西出來,可能會出現問題。您可以做的最好的方法是在您的Runnable中設置一個標誌,告知您活動已暫停。

  2. 不,應用程序不是遇害,剛剛停止(除非Android進程管理器像往常一樣殺死內存)。在這種情況下,您的計時器線程繼續運行,執行在主線程Runnable,與1

+0

for 1 - 我認爲一個不錯的方法是創建一個全局布爾值'boolean activityIsRunning;'並在onResume()中將其設置爲true,並在onPause()內設置false並執行類似if(activityIsRunning){//運行處理程序否? ---- for 2 - 看一看,鏈接暗示該應用程序是內置的殺死而非停止。不確定的壽。 – tony9099

+0

對於1,是的,就是這樣。 對於2,除非流程管理員在停止活動後立即決定*它必須殺死您的應用程序,否則它仍會運行。但是這正是你從Android開始就必須承擔的事情。關於1的 – Darkhogg

+0

,是否有助於考慮使用weakReference?或者上述方法綽綽有餘? – tony9099