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基础没打好,防止以后类似的错误再次出现,也希望能帮助遇到类似问题的小伙伴们