一個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,直截了當,完美地完成工作。 但爲了更好地把握這個想法,我有一些擔憂和問題。
- 假設同步太多時間,並且用戶按下後退按鈕。這將導致onPause被引起,這將停止定時器重複自身,但是正在運行的TimerTask將繼續運行。但是當代碼到達
myHandler.post(myRunnable);
那一行處理程序調用runnable時會發生什麼情況,但是沒有更新的GUI?我在那裏得到一個空指針嗎? - 假設同步開始並且又花了很多時間,在這種狀態下,用戶按下主頁按鈕並退出應用程序,並從'最近的應用程序'中刪除應用程序,'殺死'應用程序,調用所有方法上的onDestroy()。在這種情況下,計時器的線程(它是一個單獨的線程而不是UI線程)是否停止在哪裏(即使它可能在中間),因爲它與應用程序相關聯?),假設這是真的,代碼甚至不會到達
myHandler.post(myRunnable);
,所以不會出現空指針。是這種情況嗎?
使用相同的潛在問題'runOnUIThread'爲什麼,如果你想重複一些任務 – Raghunandan
@Raghunandan不只是處理程序runOnUIThread有時會引起我的問題。我不能只使用處理程序,因爲我正在執行網絡任務。該處理器將在UI線程上運行(因爲我創造它那裏).. – tony9099
爲什麼不使用的AsyncTask它更容易使用 – Raghunandan