2

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

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

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

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

1 回答 1

0
  1. 是的,该事件将运行,如果您取消它可能会导致问题。您能做的最好的事情就是有一个标志,从您的 中告诉您Runnable活动已暂停。

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

于 2013-10-29T14:38:39.717 回答