某天在学习分析android-UniversalMusicPlayer项目时,看到别人写更新音乐进度条时,觉得写法思路不一样,所以记录下来。
![](https://img.haomeiwen.com/i2672902/7e476aa6accdce1a.png)
当然在Activity退出的时候还是要释放资源的
@Override
public void onDestroy() {
super.onDestroy();
stopSeekbarUpdate();
mExecutorService.shutdown();
}
所以来学习下这个ScheduledExecutorService
延迟n秒执行
mExecutorService.schedule(new Runnable() {
@Override
public void run() {
}
},3,TimeUnit.SECONDS);
arg1秒后,每隔arg2时间后循环执行任务
scheduleAtFixedRate:该方法在initialDelay时长后第一次执行任务,以后每隔period时长,再次执行任务。注意,period是从任务开始执行算起的。开始执行任务后,定时器每隔period时长检查该任务是否完成,如果完成则再次启动任务,否则等该任务结束后才再次启动任务
mScheduleFuture = mExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
mHandler.post(mRunnable);
}
},0,1000, TimeUnit.MILLISECONDS);
Timer和ScheduledExecutorService的分析
Timer也是调度器,但它有一些缺陷,参考
Timer的缺陷 用ScheduledExecutorService替代
放弃Timer
概括为两点:
- timer执行定时任务时只会创建一个线程,在处理多任务时会存在错误,比方说任务1耗时3s在1s延迟后执行,任务2在3s延迟后执行。最终任务2会在4s后执行,因为单线程,先要执行任务1
- 在任务1发生异常时,后续任务2也会终止,用ScheduledExecutorService则不会。
网友评论