Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用处理程序从TimerTask更新GUI_Java_Android_Timer - Fatal编程技术网

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@Raghunandan
    AsyncTask
    不是用于此的工具,对于1-我认为一个很好的方法是创建一个全局布尔值
    boolean activityIsRunning并在onResume()内将其设置为true,在onPause()内将其设置为false,然后执行类似“if(activityIsRunning){//run handler}no”这样的操作对于2-看一看-听一听,该链接暗示该应用程序已被终止,而不是停止。不确定。对于1,是的,就是这样。对于2,除非流程管理器在停止活动后立即决定必须终止您的应用程序,否则它仍将运行。但这是你必须从Android中考虑的问题。关于1,它有助于考虑使用弱引用吗?或者上述方法就足够了?不,除非你有很好的理由,否则不要使用弱引用。只要像你说的那样进行
    if
    设置,一切都应该正常。