2012-04-16 47 views
2

Im使用Timer來連續更新TextView,但我在onResume()方法中重新啓動計時器時遇到問題。我在onPause()onDestroy()方法中使用timer.cancel(),但是如何在onResume()中重新啓動計時器?在onResume()方法中重新啓動計時器?

這是我的計時碼...

int delay = 1000; 
int period = 1000; 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 
     //I update the TextView here 
    } 

}, delay, period); 

回答

2

你不重新啓動定時器。而是使用一個新的計時器,即在onResume()內創建一個新的計時器。因爲你不再使用前一個,所以垃圾收集將會照顧它。所以在的onResume()使用下面的代碼:

timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 

    //update the TextView here 

} 

}, delay, period); 
+0

但我認爲你不能使用定時器,因爲它創建一個新的線程,主UI線程 – Snake 2012-05-31 17:47:35

+0

@Snake上沒有n要執行更新GUI:有些GUI更新功能的工作從非GUI線程調用時,但這是沒有很好的文件。對於在GUI線程之外不能調用的其他函數,如果絕對必要,我們可以使用runOnGUIThread()函數。我寧願使用Handler來完成這種任務。 – binW 2012-06-01 09:55:40

5

一種更簡便的方法是使用Handler類。我不會推薦Timer類,因爲它對你的Activity的生命週期沒有影響,你將不得不擔心任何潛在的線程問題。使用Handler的美妙之處在於你所有的回調函數都在主線程中(所以不用擔心線程問題)。以下是關於如何執行此操作的一個簡單示例。

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    .... 
    mHandler = new Handler(); 
} 

@Override 
protected void onResume() 
{ 
    mHandler.postDelayed(myRunnable, UPDATE_RATE); 
} 

@Override 
protected void onPause() 
{ 
    mHandler.removeCallbacks(myRunnable); 
} 

private final Runnable myRunnable= new Runnable() { 
    @Override 
    public void run() 
    { 
     //Do task 
     mHandler.postDelayed(myRunnable, UPDATE_RATE); 
    } 
}