我正在尝试停止Timer或TimerTask,但该方法不会破坏任务......
首先是我如何设置timertask的代码:
scanTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
load_unread();
Log.d("TIMER", "Timer set off");
}
});
}};
t = new Timer(); t.schedule(scanTask,300,10000);
现在我正试图在onDestroy上“杀死”这个任务:
@Override
protected void onDestroy() {
super.onDestroy();
scanTask.cancel();
t.cancel();
t.purge();
handler.removeCallbacksAndMessages(null);
System.out.println("Chat destroyed");
}
但这不起作用?能帮我找一个解决方案吗?
谢谢!
编辑:我终于找到了答案。不知道为什么我的工作不起作用......这里是每个遇到相同问题的人的代码。我认为无论如何这是一个更好,更有效的解决方案:
private Handler handler = new Handler();
runnable.run();
private Runnable runnable = new Runnable()
{
public void run()
{
//
// Do the stuff
//
handler.postDelayed(this, 1000);
}
};
private Runnable runnable = new Runnable()
{
public void run()
{
//
// Do the stuff
//
handler.postDelayed(this, 1000);
}
};
并停止:
handler.removeCallbacks(runnable);
取自这里:
答案 0 :(得分:1)
在查看您的编辑后,我唯一建议的是使用handler.post(runnable);
而不是runnable.run();
这样,您总是在单独的线程上执行runnable。否则,您的第一次执行将在主线程上运行,然后将来的执行在一个单独的线程上的处理程序内运行。
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
//
// Do the stuff
//
handler.postDelayed(this, 1000);
}
};
handler.post(runnable);
答案 1 :(得分:0)
在将TimerTask设置为null之前取消它。
scanTask.cancel();
答案 2 :(得分:0)
此示例启动定时器unitl销毁
private lateinit var timerTask: TimerTask
timerTask = object : TimerTask() {
override fun run() {
Log.d("KTZ", "$minutes:$seconds");
timeRecordingLiveData.postValue("$minutes:$seconds")
seconds += 1;
if (seconds == 60) {
Log.d("KTZ", "$minutes:$seconds");
timeRecordingLiveData.postValue("$minutes:$seconds")
seconds = 0;
minutes += 1;
}
}
}
取消onDestroy()中的timertask
timerTask.cancel()