2013-10-29 55 views
2

一个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,直截了当,完美地完成工作。 但为了更好地把握这个想法,我有一些担忧和问题。

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

使用相同的潜在问题'runOnUIThread'为什么,如果你想重复一些任务 – Raghunandan

+0

@Raghunandan不只是处理程序runOnUIThread有时会引起我的问​​题。我不能只使用处理程序,因为我正在执行网络任务。该处理器将在UI线程上运行(因为我创造它那里).. – tony9099

+0

为什么不使用的AsyncTask它更容易使用 – Raghunandan

回答

0
  1. 是,该事件将运行,如果你废掉的东西出来,可能会出现问题。您可以做的最好的方法是在您的Runnable中设置一个标志,告知您活动已暂停。

  2. 不,应用程序不是遇害,刚刚停止(除非Android进程管理器像往常一样杀死内存)。在这种情况下,您的计时器线程继续运行,执行在主线程Runnable,与1

+0

for 1 - 我认为一个不错的方法是创建一个全局布尔值'boolean activityIsRunning;'并在onResume()中将其设置为true,并在onPause()内设置false并执行类似if(activityIsRunning){//运行处理程序否? ---- for 2 - 看一看,链接暗示该应用程序是内置的杀死而非停止。不确定的寿。 – tony9099

+0

对于1,是的,就是这样。 对于2,除非流程管理员在停止活动后立即决定*它必须杀死您的应用程序,否则它仍会运行。但是这正是你从Android开始就必须承担的事情。关于1的 – Darkhogg

+0

,是否有助于考虑使用weakReference?或者上述方法绰绰有余? – tony9099