2013-03-15 102 views
14

我的Android应用程序中有一个动画,它使TextView呈现不同的颜色。我使用了TimerTask,Timer和Runnable方法来实现这一点。我需要做的就是当用户在onPause()这个动画中离开应用程序时停止线程,并在用户返回到onResume()中的应用程序时恢复线程。以下是我实现的代码,但它不工作(onPause()和onResume()件),我不明白为什么。我已经阅读了其他一些关于类似问题的文章,但他们并没有帮助我找出在我的情况下做什么。我读过TimerTasks已经过时了,我应该使用一个ExecutorService方法;我不清楚如何实现这个功能。如何暂停和恢复TimerTask /定时器

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

[暂停/停止和启动/恢复持续的Java的TimerTask?]的可能的复制(http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously ) – Gboy 2017-02-11 12:29:12

回答

12

TimerTask被取消,不能再运行,你必须创建一个新的实例。

阅读细节在这里:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor推荐用于新的代码,它处理的情况下,像异常和任务采取更长的时间比预定的时间间隔。

但是对于你的任务,TimerTask应该足够了。

+0

好吧,我之前看到这篇文章,并且很困惑,也许你可以为我澄清一些事情:用户可能会在TimerTask活动期间离开我的应用程序,并且多次返回该活动。那不是说我每次用户离开时都会在onResume()中创建一个TimerTask的新实例,并返回? – embersofadyingfire 2013-03-16 04:18:45

+0

问题:如果我忽略用户离开此活动一段时间并返回的操作,并忽略用于暂停和恢复TimerTask的任何实现,但实现onStop()以在用户最终前进到时取消TimerTask另一个活动,当TimerTask活动暂停时这会导致某种内存泄漏吗? – embersofadyingfire 2013-03-16 05:57:06

+1

我不认为会有任何内存泄漏,但没有任何意义让你的UI更新任务在后台运行。是的,你应该即时创建TimerTask,它不可重用。它是这样设计的。 (我猜为线程安全)onResume也不是一些紧密的循环,创建对象的成本可以忽略不计。 – 2013-03-16 06:59:09

2

下面是我做到的。添加pauseTimer布尔值,在那里暂停发生(也许按钮侦听器),并且如果为真,则不计数定时器。

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
}