在编程中经常会用到定时器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用一次,不会重复使用的情况下可以。否则报错。关闭计时器方式和上方一样,可在你想关闭的地方关闭。