背景
这是个抽象类,我觉得这个定时器实现有点简单,但是具有不稳定性,也就有点意思;也许你对它的实现会感兴趣,请跟我来
成员变量
private final long mMillisInFuture;
private final long mCountdownInterval;
private long mStopTimeInFuture;
private boolean mCancelled = false;
执行总时长,执行间隔,停止时间,可取消; 执行总时长,执行间隔,通过构造器传入
核心成员变量
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
synchronized (CountDownTimer.this) {
if (mCancelled) {
return;
}
final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
if (millisLeft <= 0) {
onFinish();
} else {
long lastTickStart = SystemClock.elapsedRealtime();
onTick(millisLeft);
long lastTickDuration = SystemClock.elapsedRealtime() - lastTickStart;
long delay;
if (millisLeft < mCountdownInterval) {
delay = millisLeft - lastTickDuration;
if (delay < 0) delay = 0;
} else {
delay = mCountdownInterval - lastTickDuration;
while (delay < 0) delay += mCountdownInterval;
}
sendMessageDelayed(obtainMessage(MSG), delay);
}
}
}
};
- 利用了handler消息机制;但是handler,其执行线程,为初始化所处线程;如果不是主线程,需要自己启用looper
- 到达结束时间,则调用onFinish方法,结束
- 上次任务onTick执行时间,暂用总共可执行时间
- 两次重复执行主体时间间隔为预期时间的倍数
抽象方法
public abstract void onTick(long millisUntilFinished);
public abstract void onFinish();
定时结束、每次任务执行
取消与执行
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
public synchronized final CountDownTimer start() {
mCancelled = false;
if (mMillisInFuture <= 0) {
onFinish();
return this;
}
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
mHandler.sendMessage(mHandler.obtainMessage(MSG));
return this;
}
通过消息机制取消;通过消息机制进行定时执行
总结
- 一个使用比较轻松的定时器,主线程中不需要做多余的管理操作;
- 在规定时间内,可以间隔执行任务的定时器
- 执行次数不确定的定时器
- 首次不能延时执行
这样的定时器,被使用场景裹住了脚,用起来贼有意思
技术变化都很快,但基础技术、理论知识永远都是那些;作者希望在余后的生活中,对常用技术点进行基础知识分享;如果你觉得文章写的不错,请给与关注和点赞;如果文章存在错误,也请多多指教!