使用Handler从TimerTask更新GUI

时间:2013-10-29 14:31:18

标签: java android timer

在全球范围内,我有以下内容:

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);
    }
}

我的处理程序和runnable全局声明如下

final Handler myHandler = new Handler();

final Runnable myRunnable = new Runnable()
{
   public void run() 
   {
        //update GUI, text views whatever.
   }
};

在我的onPause()中,我打电话给timer.cancel();

上面的代码很简洁,直截了当,完美地完成了工作。 但为了更好地掌握这个想法,我有一些顾虑和问题。

  1. 假设同步时间过长,用户按下后退按钮。这将导致导致onPause,这将停止计时器重复自身,但运行的TimerTask将继续运行。但是当代码到达处理程序调用runnable的myHandler.post(myRunnable);行时会发生什么,但是没有GUI可以更新?我在那里得到一个空指针吗?
  2. 假设同步开始并再次花费了很多时间,在这种状态下,用户按下主页按钮退出应用程序并从“最近的应用程序”中删除应用程序“杀死”应用程序,调用onDestroy()对所有方法。在这种情况下,计时器的线程(它是一个单独的线程,而不是UI线程,在任何地方停止,(即使它可能在中间),因为它与应用程序相关联?),假设这是是的,代码甚至不会到达myHandler.post(myRunnable);所以不会出现空指针..这是这种情况吗?

1 个答案:

答案 0 :(得分:0)

  1. 是的,该事件将会运行,如果您取消了某些内容,则可能会导致问题。您可以做的最好的事情是在您的Runnable上设置一个标记,告诉您该活动已暂停。

  2. 不,应用程序不是被杀,只是停止了(除非Android进程管理器像往常一样将其杀死内存)。在这种情况下,您的计时器线程继续运行并在主线程中执行Runnable,具有相同的潜在问题1.