2013-03-28 47 views
8

我的应用程序中有一个定时器,每15秒启动一次AsyncTask。Android重新启动定时器被取消后

Timer timer = new Timer(); 

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
} 

这是从onCreate()方法启动。

当我打电话给另一个活动时,我需要取消这个计时器,在我的主要活动中,我在onPause()方法中使用了timer.cancel()

现在当我回到主要活动时,我需要重新启动计时器。我尝试在onRestart()方法中重新启动AsynchTaskTimer(),但我得到了java.lang.IllegalStateException: Timer was canceled

如何重新启动计时器?

+0

在onpause中将timer设置为null,并重新启动它,如timer = new Timer();并启动它作为旧的散列对象被取消它不能重新启动,除非重新启动一个新的 – 2013-03-28 11:35:45

+0

为什么你一起使用处理程序和计时器? – tony9099 2013-10-28 21:40:51

回答

14

尝试使用:

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer = new Timer(); //This is new 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
    } 

利用这一点,你可以再次分配内存以定时器和AFAIK启动它。

+0

谢谢,这个作品,结合取消'onPause()'方法中的计时器! – pteixeira 2013-03-28 11:45:35

+0

这是伟大的! – 2013-03-28 11:46:58

+0

唯一不能得到的是schedule()方法的第二个参数是什么? timer.schedule(timertask,0,15000),在这个例子中,0代表 – antroid 2017-03-15 19:27:57

12

那么说,有关文档取消()方法:

注意,从 重复的计时器任务的run方法中调用此方法绝对保证计时器任务将 不会再次运行。

这意味着如果您曾经取消()Timer,您将无法再次运行它。您需要创建Timer的新实例,例如在onResume()方法中,如果您想再次运行它。

@Override 
public void onResume() { 
    super.onResume(); 
    // intialise new instance of Timer 
} 
1

而不是使用TimerTask的,您可以将您的代码(这是用来更新GPS)移动到service。我认为它更好。你可以拨startService()onCreate()stopService()onDestroy()。请注意,服务在主UI线程上运行,因此请确保在GPS更新程序任务中避免使用NetworkOnMainThreadException

+0

这是我最初的方法,但由于某种原因,我的服务没有启动..因为这只是一个概念证明,它不会真的很重要,但它是在我的TODO名单上,如果它发展成真实的东西! – pteixeira 2013-03-28 11:49:37

相关问题