2012-04-16 88 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); 
    } 
}