一个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