Android支持暂停的CountDownTimer倒计时工具类
文章目录
- CountDownTimer简介
- 官方代码
- 主要接口
- 注意事项
- 使用有限制
- 改进代码
- 使用示例
CountDownTimer简介
在 Android 中,CountDownTimer是一个实用的类,用于实现倒计时功能。
官方代码
官方CountDownTimer类使用示例:
new CountDownTimer(30000, 1000) {public void onTick(long millisUntilFinished) {mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);}public void onFinish() {mTextField.setText("done!");}}.start();
主要接口
- onTick(long millisUntilFinished):
这个方法在倒计时过程中,每隔指定的时间间隔就会被调用一次。
参数millisUntilFinished表示剩余的时间,单位是毫秒。你可以利用这个参数在界面上显示剩余时间,或者执行其他与倒计时相关的操作。 - onFinish():
当倒计时结束时,这个方法会被自动调用。
通常在这个方法中执行倒计时结束后的操作,比如显示提示信息、启动新的活动等。
注意事项
- CountDownTimer在主线程中运行onTick()和onFinish()方法,因此如果在这些方法中有耗时的操作,可能会导致界面卡顿。如果需要执行耗时操作,可以考虑在子线程中进行,并通过合适的方式更新界面。
- 如果在倒计时过程中需要取消倒计时,可以调用CountDownTimer的cancel()方法。例如,在活动销毁时取消倒计时可以避免资源泄漏和潜在的错误。
使用有限制
只有定时功能,无暂停及恢复并继续的功能,也无进行过程动态修改导计时时间.
改进代码
import android.os.CountDownTimer;
import android.util.Log;/*** 支持pause的倒计时, 由CountDownTimer实现的,注意CountdownTimer的源码,start(),pause(),cancel()方法都是用message和handler实现的* 如果是在子线程中执行,要加调用Looper.prepare()及Looper.loop()* 或者是使用 runOnMainThread 使其在主线程中执行** @author zm*/
public abstract class CountDownTimerExt {private static final String TAG = "CountDownTimerExt";/*** 倒计时实现类*/private CountDownTimer countDownTimer;/*** 间隔*/private long mInterval;private boolean isTimerPaused;private long millisInFuture;private long remainingTime;/*** @param millisInFutureIn 总时长* @param interval onTick间隔*/public CountDownTimerExt(long millisInFutureIn, long interval) {mInterval = interval;isTimerPaused = true;millisInFuture = millisInFutureIn;remainingTime = millisInFutureIn;}public final boolean isTimerPaused() {return isTimerPaused;}public final void setTimerPaused(boolean value) {isTimerPaused = value;}public final long getMillisInFuture() {return millisInFuture;}public final void setMillisInFuture(long value) {millisInFuture = value;}public final long getRemainingTime() {return remainingTime;}public final void setRemainingTime(long value) {remainingTime = value;}public final void start() {startIt(remainingTime, mInterval);}public final void start(long millisInFutureIn, long remainingTimeIn, long interval) {millisInFuture = millisInFutureIn;remainingTime = remainingTimeIn;mInterval = interval;start();}public final synchronized void startIt(long millisInFutureIn, long interval) {remainingTime = millisInFutureIn;mInterval = interval;if (millisInFuture > 0L && interval > 0L) {if (!isTimerPaused) {// 有运行中的先stopstop();}if (isTimerPaused) {// 有暂停或未运行的,创建CountDownTimer实现, 确保运行在主线程countDownTimer = (CountDownTimer)(new CountDownTimer(getRemainingTime(), mInterval) {@Overridepublic void onFinish() {onTimerFinish();stop();}@Overridepublic void onTick(long millisUntilFinished) {// 这里会记录剩余的时长保存到remainingTime, 方便暂停后能再恢复setRemainingTime(millisUntilFinished);onTimerTick(millisUntilFinished);}});try {countDownTimer.start();} catch (Exception e) {e.printStackTrace();}isTimerPaused = false;} else {Log.d(TAG, "ignore start");}} else {Log.d(TAG, "invalid parameter");}}/*** 停止*/public final void stop() {try {countDownTimer.cancel();} catch (Exception e) {e.printStackTrace();}isTimerPaused = true;remainingTime = millisInFuture;}/*** 暂停*/public final void pause() {if (!isTimerPaused) {try {countDownTimer.cancel();} catch (Exception e) {e.printStackTrace();}isTimerPaused = true;}}/*** 恢复*/public final void resume() {if (!isRunning()) {// 通过remainingTime得到剩余的时长startIt(remainingTime, mInterval);}}/*** 运行中* @return*/public final boolean isRunning() {return !isTimerPaused;}/*** 每次触发倒计时回调* @param value*/public abstract void onTimerTick(long value);/*** 倒计时完成回调*/public abstract void onTimerFinish();}
使用示例
// 倒计时计时器
CountDownTimerExt countDownTimer = new CountDownTimerExt(restTimeMs, 1000) {@Overridepublic void onTimerTick(long value) {}@Overridepublic void onTimerFinish() {close();}
};
countDownTimer.start();countDownTimer.pause();countDownTimer.resume();
作者:帅得不敢出门 出处