android Timer TimerTask 启动与停止及常见无法停止问题解决

来源:互联网 发布:python ide推荐 编辑:程序博客网 时间:2024/06/15 07:59

在编程中经常会用到定时器Timer

private void setTime(){        time_right.setVisibility(View.VISIBLE);        timer = new Timer(true);        timerTask = new MyTimerTask();        musicCurrentDuration = 0;        timer.schedule(timerTask,0,1000);    }    private long musicCurrentDuration = 0;    private MyTimerTask timerTask;    private class MyTimerTask extends TimerTask{        @Override        public void run() {//            int duration = mVideoView.getDuration();            musicCurrentDuration += 1000;            if (musicCurrentDuration >= musicDuration){                cancel();                if (timer!= null){                    timer.purge();                    timer.cancel();                    timer = null;                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        camera_start_pause.performClick();                    }                });                return;            }//            int currentPosition = mVideoView.getCurrentPosition();            try {                final String s = TimeUtils.longToString(musicCurrentDuration, "mm:ss");                final String ss = TimeUtils.longToString(musicDuration,"mm:ss");                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        time_right.setText(s+"/"+ss);                    }                });            } catch (ParseException e) {                e.printStackTrace();            }        }    };

这是一个使用场景,我们打开定时器,执行timertask,注意,这个timertask每次都要重新new一个,否则会报错。timer不需要。当定时器的timertask执行后,我们分两种情况,一个是run方法内部的判断生效,这时我们执行自己需要的操作,并且注意关闭timertask 和timer,而且注意顺序先关闭timertask 再关闭timer,

如果我们提前手动处理了,计时器中的操作还未到时间,也需要关闭计时器,和上面一样顺序。
最好在onDestroy中也执行关闭操作

@Override    protected void onDestroy() {        super.onDestroy();        if (timerTask != null){            timerTask.cancel();            timerTask = null;        }        if (timer != null){            timer.cancel();            timer.purge();            timer = null;        }    }

还有一种timertask的写法

 private void setTime(){        if (timer==null) {            time.setVisibility(View.VISIBLE);            timer = new Timer(true);            timer.schedule(timerTask, 0, 500);        }    }    private TimerTask timerTask=new TimerTask() {        @Override        public void run() {            if (mVideoView == null){                return;            }            int duration = mVideoView.getDuration();            int currentPosition = mVideoView.getCurrentPosition();            try {                final String s = TimeUtils.longToString(duration, "mm:ss");                final String ss = TimeUtils.longToString(currentPosition,"mm:ss");                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        time.setText(ss+"/"+s);                    }                });            } catch (ParseException e) {                e.printStackTrace();            }        }    };

这种方式只在timertask用一次,不会重复使用的情况下可以。否则报错。关闭计时器方式和上方一样,可在你想关闭的地方关闭。

阅读全文
0 0