美文网首页
(Android)TimerTask间隔执行无法停止问题

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

作者: 37c7796cd658 | 来源:发表于2017-05-05 11:14 被阅读698次

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

    相关文章

      网友评论

          本文标题:(Android)TimerTask间隔执行无法停止问题

          本文链接:https://www.haomeiwen.com/subject/sknrdttx.html