当前位置: 首页 > article >正文

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();

主要接口

  1. onTick(long millisUntilFinished):
    这个方法在倒计时过程中,每隔指定的时间间隔就会被调用一次。
    参数millisUntilFinished表示剩余的时间,单位是毫秒。你可以利用这个参数在界面上显示剩余时间,或者执行其他与倒计时相关的操作。
  2. onFinish():
    当倒计时结束时,这个方法会被自动调用。
    通常在这个方法中执行倒计时结束后的操作,比如显示提示信息、启动新的活动等。

注意事项

  1. CountDownTimer在主线程中运行onTick()和onFinish()方法,因此如果在这些方法中有耗时的操作,可能会导致界面卡顿。如果需要执行耗时操作,可以考虑在子线程中进行,并通过合适的方式更新界面。
  2. 如果在倒计时过程中需要取消倒计时,可以调用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();

作者:帅得不敢出门 出处

http://www.lryc.cn/news/2419579.html

相关文章:

  • RAR Extractor - Unarchiver for Mac v6.5.0 解压缩软件
  • HTML5字体样式属性
  • 【知识分享】vue制作一个页面计算器
  • 基于华为云服务器的 openEuler 20.03 (LTS) 版本配置 LAMP,部署WordPress
  • WiFi、WiMAX、WBMA与3G的比较
  • Spring基础3——AOP,事务管理
  • 美少女万华镜2:勿忘草与永远的少女 for Mac 支持M1/M2 中文版 苹果电脑游戏
  • 网络负载均衡(NLB)及Session 同步相关
  • EDK II环境搭建(Windows系统)
  • Java的ResultSet对象,默认是不可更新的
  • DirectShow 概念介绍
  • bind9新手入门
  • 人本主义流派,罗杰斯人本主义理论,马斯洛的人本主义人格理论
  • CGO中使用ReadProcessMemory读取其他进程内存
  • linux构建widi显示服务,如此简单 Intel WiDi无线高清设置教程
  • Lua userdata详解
  • 典型相关分析 CCA
  • Makefile中常用到的函数总结
  • 2024年最新网络安全人士必备的13个漏洞库_通用漏洞数据库,2024年最新网络安全开发基础机构
  • 在浏览器中输入www.baidu.com后执行的全部过程
  • 博客管理系统设计与实现
  • 第二幕:C语言基础篇之基本数据类型(基本整型、短整型、长整型、双长整型、字符型、单精度浮点型、双精度浮点型、复数浮点型、无符号类型、布尔型、格式符(占位符))
  • 探索Python实用工具库:Boltons
  • VLAN的配置
  • selenium开发环境部署Maven官方依赖porm文件分享
  • 欧美风格网站设计的网页字体风格选择
  • 史上最污技术解读...啊哈~“好变态”~~~
  • AVPlayer 播放在线视频和本地文件(数据库)设置
  • 【RDMA】9. RDMA之Queue Pair
  • C基础-12