Java 使用处理程序从TimerTask更新GUI
在全球范围内,我有以下几点:Java 使用处理程序从TimerTask更新GUI,java,android,timer,Java,Android,Timer,在全球范围内,我有以下几点: Timer=new Timer() 在我的onResume()中,我有以下代码 timer.schedule(新的syncTimerTask(),13000) 我的syncTimerTask如下所示: class syncOutgoingUpdatesTimerTask extends TimerTask { public void run() { //some sync process with outer back end server
Timer=new Timer()代码>
在我的onResume()中,我有以下代码
timer.schedule(新的syncTimerTask(),13000)代码>
我的syncTimerTask如下所示:
class syncOutgoingUpdatesTimerTask extends TimerTask
{
public void run()
{
//some sync process with outer back end server
//fetch results etc
myHandler.post(myRunnable);
}
}
my handler和runnable全局声明如下
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)代码>因此不会出现空指针。。是这样吗
是的,该事件将运行,如果您取消设置,则可能会导致问题。您所能做的最好的事情就是在Runnable
中设置一个标志,告诉您活动已暂停
不,应用程序没有被杀死,只是停止了(除非Android进程管理器像往常一样为了内存而杀死它)。在这种情况下,计时器线程继续运行,并在主线程中执行Runnable
,潜在问题与1相同
使用runOnUIThread
,如果您想重复一些,为什么不使用handler呢task@RaghunandanrunOnUIThread有时会给我带来麻烦。我不能只使用handler,因为我正在执行网络任务。处理程序将在UI线程上运行(因为我正在那里创建它)…为什么不使用asynctask呢?它更容易使用所以使用HandlerThread而不是Timer/TimerTaskstuff@RaghunandanAsyncTask
不是用于此的工具,对于1-我认为一个很好的方法是创建一个全局布尔值boolean activityIsRunning代码>并在onResume()内将其设置为true,在onPause()内将其设置为false,然后执行类似“if(activityIsRunning){//run handler}no”这样的操作对于2-看一看-听一听,该链接暗示该应用程序已被终止,而不是停止。不确定。对于1,是的,就是这样。对于2,除非流程管理器在停止活动后立即决定必须终止您的应用程序,否则它仍将运行。但这是你必须从Android中考虑的问题。关于1,它有助于考虑使用弱引用吗?或者上述方法就足够了?不,除非你有很好的理由,否则不要使用弱引用。只要像你说的那样进行if
设置,一切都应该正常。