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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文包括:1、Listener简介2、Servlet监听器3、监听三个域对象创建和销毁的事件监听器4、监听三个域对...
    廖少少阅读 6,223评论 6 28
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,863评论 18 399
  • 一直以来就想写技术博文了,之前有在csdn写过,最近一段时间csdn不知道什么问题,无法写博客。平时也喜欢...
    bruce1990阅读 2,957评论 0 4
  • 桃花相映 何及你十里红装 倾城容颜 岂谈沉鱼落雁 愿得君心一世 如水柔情只为君 此生芳香未央 情若无根 怎开艳三生季节
    浅浅蓝九妹阅读 239评论 7 12