在全球范围内,我有以下内容:
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();
上面的代码很简洁,直截了当,完美地完成了工作。但为了更好地掌握这个想法,我有一些顾虑和疑问。
- 假设同步时间太长,并且用户按下了后退按钮。这将导致 onPause 发生,这将阻止计时器重复自身,但是正在运行的 TimerTask 将继续运行。但是当代码到达
myHandler.post(myRunnable);
处理程序调用runnable的行时会发生什么,但没有要更新的GUI?我在那里得到一个空指针吗? - 假设同步开始并且再次花费了很多时间,在这种状态下,用户按下主页按钮并退出应用程序并将应用程序从“杀死”应用程序的“最近的应用程序”中删除,调用 onDestroy()在所有方法上。在这种情况下,计时器的线程(它是一个单独的线程而不是 UI 线程,无论它在哪里都停止,(即使它可能在中间),因为它与应用程序相关联?),假设这是是的,代码甚至不会到达,
myHandler.post(myRunnable);
所以不会出现空指针。是这种情况吗?