(Android)TimerTask间隔执行无法停止问题

2017-05-05  本文已影响698人  37c7796cd658

java中的作业间隔执行,比如 显示时间,并且秒数变化(08:09:23)非常常见,有很多种思路可以满足这种需求:1.handler,收到消息后直接在主线程进行处理可以;2.自己新建一个线程,通知主线程或者,获取主线程执行;3.用java封装好的TimerTask和Timer作业来实现。

我用的TimerTask和Timer来实现的显示时间的功能:

```

/**开始计时显示;传入 08:09:23格式的字符串,获取秒的数值,然后间隔一秒更新textView*/

Timer timer=null;

TimerTask timerTask=null;

private void startClock(finalString str) {

timer=new Timer();

timerTask=new TimerTask() {

intnumb= getTimeNumb(str);

@Override

public void run() {

//          Log.d("TAG", "timerTask 执。getActivity():" + getActivity());

if(getActivity() !=null) {

//获取主线程

getActivity().runOnUiThread(newRunnable() {

@Override

public voidrun() {

numb++;

curDTime=numb;

if(memo_text!=null&&memo_text.getVisibility() == View.VISIBLE)

time_text.setText(getStringTime(numb));

}

});

}

}

};

timer.schedule(timerTask,0,1000);

}

```

然后页面关闭时调用 停止作业的方法

```

/**停止计时显示*/

private voidstopClock(){

if(timerTask!=null){//&& !timerTask.cancel()

timerTask.cancel();

timer.cancel();

Log.d("TAG","timer.cancel() 执行。。。。。");

}

}

@Override

public voidonPause() {

super.onPause();

stopClock();//

}

```

问题:运行发现 关闭当前Activity我的TimerTask的run()还在执行,百思不解。在run()里面添加了Log.d();查看日志,发现输出的内容不是一秒一次,而是一秒多次;明白了原来我有多次执行startClock()方法,每次都new了新的Timer和TimerTask、创建了新的线程,而我最后 timer.cancel()关闭作业的时候只是把最后创建的线程内作业给关闭了,之前开启的多线程作业仍在执行。

解决:找到问题就好办了,每次再调用startClock()时先把之前的作业结束(毕竟这个不需要多个任务同时执行,简单粗暴),,添加stopClock()调用,修改代码:

```

/**开始计时显示*/

private voidstartClock(finalString str) {

stopClock();

timer=newTimer();

timerTask=newTimerTask() {

intnumb= getTimeNumb(str);

@Override

public voidrun() {

//          Log.d("TAG", "timerTask 执。getActivity():" + getActivity());

if(getActivity() !=null) {

//获取主线程

getActivity().runOnUiThread(newRunnable() {

@Override

public voidrun() {

numb++;

curDTime=numb;

if(memo_text!=null&&memo_text.getVisibility() == View.VISIBLE)

time_text.setText(getStringTime(numb));

}

});

}

}

};

timer.schedule(timerTask,0,1000);

}

```

多开启几次也是 标准的一秒一次了

总结:TimerTask和Timer涉及到了多线程,多线程的时候要多加注意:要么多线程同时操作数据(需要加锁或者做好异步规划),要么线程放逐(开启了就不管了,无法调度和结束)

记录一下,因为java基础没打好,防止以后类似的错误再次出现,也希望能帮助遇到类似问题的小伙伴们

上一篇下一篇

猜你喜欢

热点阅读