大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
CountDownTimer源码解析
在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能
作用
- 可用于倒计时操作,内部采用Handler来实现的
那我们来看一看它内部到底是如何实现?
-
首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法
-
构造函数
public CountDownTimer(long millisInFuture, long countDownInterval) { mMillisInFuture = millisInFuture; mCountdownInterval = countDownInterval; }
- millisInFuture: 设置倒计时的总时间(毫秒)
- countDownInterval: 设置每次减去的时间(毫秒)
-
创建对象
mCountDownTimer = new CountDownTimer(Long.MAX_VALUE, 5000) { @Override public void onTick(long l) { } @Override public void onFinish() { } }; mCountDownTimer.start();
-
onTick(long l):用于返回还剩余多长时间,每间隔一段时间回调一次
-
onFinish():当倒计时结束时回调
-
-
CountDownTimer通过start()来触发倒计时,那我们来看看里面是如何实现的
/** * Start the countdown. */ public synchronized final CountDownTimer start() { mCancelled = false; if (mMillisInFuture <= 0) { onFinish(); return this; } mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture; mHandler.sendMessage(mHandler.obtainMessage(MSG)); return this; }
-
首先会判断设置的倒计时时间是否小于等于0,是的话直接回调onFinish()方法;反之计算倒计时结束时的时间(当前时间+总的倒计时时间);然后通过handle发送消息
// handles counting down 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); // take into account user's onTick taking time to execute long lastTickDuration = SystemClock.elapsedRealtime() - lastTickStart; long delay; if (millisLeft < mCountdownInterval) { // just delay until done delay = millisLeft - lastTickDuration; // special case: user's onTick took more than interval to // complete, trigger onFinish without delay if (delay < 0) delay = 0; } else { delay = mCountdownInterval - lastTickDuration; // special case: user's onTick took more than interval to // complete, skip to next interval while (delay < 0) delay += mCountdownInterval; } sendMessageDelayed(obtainMessage(MSG), delay); } } } };
-
在Handle中我们首先会判断是否设置了mCancelled=true,若是的话直接不再处理,表示已经取消倒计时;反之,计算倒计时还剩余多少时间,若剩余时间<=0,则直接调用onFinish()表示倒计时结束;否则计算剩余时间时候大于设置每次减去的时间的时间,若是则发送延时消息,延时时间为mCountdownInterval,否则延时时间为剩余时间,这样就实现了倒计时的功能
-
-
CountDownTimer通过cancel()来取消倒计时
/** * Cancel the countdown. */ public synchronized final void cancel() { mCancelled = true; mHandler.removeMessages(MSG); }
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192024.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...