安卓CountDownTimer的使用

news/2024/4/29 3:57:42/文章来源:https://blog.csdn.net/qq_45649553/article/details/137093127

目录

  • 一、简介
    • 1.1 CountDownTimer简介
    • 1.2 常用API
  • 二、CountDownTimer的用法
    • 2.1 主线程中使用
    • 2.2 工作线程中使用
  • 三、使用注意
    • 3.1 空指针
    • 3.2 时间不是太准的问题
    • 3.3 内存泄漏问题


一、简介

CountDownTimer是Android中的一个类,用于实现倒计时功能。通过CountDownTimer类,可以创建一个倒计时器,指定总倒计时时间以及每次倒计时的间隔时间。一旦倒计时开始,CountDownTimer会在指定的间隔时间内执行操作,直到倒计时结束。

1.1 CountDownTimer简介

CountDownTimer 是一个抽象类,包装了两个抽象方法onTick()和onFinish(),通常在使用的时候继承自CountDownTimer实现这两个抽象方法,内部封装了Handler,CountDownTimer是基于Handler实现的。

public abstract class CountDownTimer {public CountDownTimer(long millisInFuture, long countDownInterval) {mMillisInFuture = millisInFuture;mCountdownInterval = countDownInterval;}/*** Callback fired on regular interval.* @param millisUntilFinished The amount of time until finished.*/public abstract void onTick(long millisUntilFinished);/*** Callback fired when the time is up.*/public abstract void onFinish();......

1.2 常用API

  • CountDownTimer(long millisInFuture, long countDownInterval)
    millisInFuture: 表示总的倒计时时间,以毫秒为单位。在倒计时结束之前,倒计时器将一直执行。
    countDownInterval: 表示倒计时的间隔时间,以毫秒为单位。每隔这个时间间隔,onTick方法将会被调用一次。
  • start():
    作用:启动倒计时器,开始执行倒计时。
    示例:countDownTimer.start();
  • cancel():
    作用:取消倒计时器,停止倒计时的执行。
    示例:countDownTimer.cancel();
  • onTick(long millisUntilFinished):
    作用:在每次倒计时间隔结束时调用,用于执行更新UI等操作。
    millisUntilFinished: 表示距离倒计时结束还有多少时间,以毫秒为单位。
    示例:
    new CountDownTimer(60000, 1000) {
    public void onTick(long millisUntilFinished) {
    textView.setText("Seconds remaining: " + millisUntilFinished / 1000);
    }
    public void onFinish() {
    textView.setText(“Done!”);
    }
    }.start();
  • onFinish():
    作用:在倒计时结束时调用,用于执行最终的操作。
    示例:
    new CountDownTimer(60000, 1000) {
    public void onTick(long millisUntilFinished) {
    // Do something on tick
    }
    public void onFinish() {
    textView.setText(“Done!”);
    }
    }.start();

二、CountDownTimer的用法

2.1 主线程中使用

Oncreate里使用

    public static void test5() {CountDownTimer countDownTimer = new CountDownTimer(1000L * 30, 1000L) {@Overridepublic void onTick(long millisUntilFinished) {// your logic for tickLog.i("TEST", "onTick - " + Thread.currentThread() + ", id - " + Thread.currentThread().getId()+" "+millisUntilFinished);}@Overridepublic void onFinish() {// your logic for finishLog.i("TEST", "onFinish" + Thread.currentThread() + ", id - " + Thread.currentThread().getId());}};countDownTimer.start();}

在这里插入图片描述
回调执行在主线程,意味着可以在回调中直接处理UI,挺方便的。

2.2 工作线程中使用

在工作线程使用不能像在主线程一样简单使用,因为CountDownTimer是基于Handler的,主线程已经由安卓框架层启动了消息循环,可以直接使用。
那么在工作线程中怎样使用呢?可以借助HanderThread。在onLooperPrepared()中初始化并开启CountDownTimer:

    public static void test6() {new HandlerThread("TestThread") {protected void onLooperPrepared() {CountDownTimer countDownTimer = new CountDownTimer(1000L * 15, 1000L) {@Overridepublic void onTick(long millisUntilFinished) {// your logic for tickLog.i("TEST", "onTick - " + Thread.currentThread() + ", id - " + Thread.currentThread().getId() + " " + millisUntilFinished);}@Overridepublic void onFinish() {// your logic for finishLog.i("TEST", "onFinish" + Thread.currentThread() + ", id - " + Thread.currentThread().getId());}};countDownTimer.start();}}.start();}

在这里插入图片描述
这一次运行在HandlerThread封装的TestThread线程中。

三、使用注意

3.1 空指针

空指针:当一个Activity或Fragment被销毁时,如果CountDownTimer的onTick()方法还在继续执行,而UI控件已经为空(比如Activity或Fragment的生命周期已经结束,UI控件已经被销毁),那么在onTick()方法中对UI控件的操作就会导致空指针异常。这是因为UI控件已经不存在,无法进行正常的操作。

解决办法:一般要在activity或fragment销毁的时候调用cancle方法。

    @Overrideprotected void onDestroy() {if (mCountDownTimer != null) {mCountDownTimer.cancel();}super.onDestroy();}

3.2 时间不是太准的问题

在CountDownTimer执行start后时,google源码里面减去了程序执行到这里的时候所消耗的时间

        public void handleMessage(Message msg) {synchronized (CountDownTimer.this) {if (mCancelled) {return;}final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();if (millisLeft <= 0) {onFinish();

解决办法:
可以在构造方法里面稍微加一点时间就可以解决如60s

new CountDownTimer(60 * 1000+300, 1000)

3.3 内存泄漏问题

如果外部类在CountDownTimer执行期间被销毁,但CountDownTimer仍然持有对外部类的引用,这就会导致外部类无法被正常回收,从而引发内存泄漏。

解决办法:使用弱引用持有UI控件

 WeakReference<TextView> tv;//控件软引用,防止内存泄漏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027858.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…

机器学习-生存分析:基于QHScrnomo模型的乳腺癌患者风险评估与个性化预测

一、引言 乳腺癌作为女性常见的恶性肿瘤之一&#xff0c;对女性健康构成威胁。随着医疗技术的不断进步&#xff0c;个性化医疗逐渐成为乳腺癌治疗的重要方向。通过深入研究乳腺癌患者的风险评估和个性化预测&#xff0c;可以帮助医生更准确地制定治疗方案&#xff0c;提高治疗效…

windows下QT如何集成OpenCV

说明 我在windows下使用QT Creator12创建的CMake项目&#xff0c;需要OpenCV的一些功能。由于安装的时候我选择的QT组件都是MInGW的&#xff0c;所以无法使用VS studio版本的dll库。 为什么vs的版本不能用 我安装QT选择的是MinGW版本&#xff0c;本地编译QT工程只能选择MinG…

零基础10 天入门 Web3之第1天

10 天入门 Web3 Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 想要一起探讨学习的…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的&#xff0c;使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 二、特性(为什么要用Redis&#x…

地方废物回收机构管理的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

Linux的学习之路:3、基础指令(2)

一、echo指令 这个指令在上篇文章我也用了但是忘了说了&#xff0c;这个指令的大概用法就是把后面跟的文本等输出在显示器上&#xff0c;如下代码所示打印的“Hello Linux” [rootVM-24-9-centos ~]# echo "Hello Linux" Hello Linux二、输出重定向与输入重定向 着…

vue前端工程化

前言 本文介绍的是有关于vue方面的前端工程化实践&#xff0c;主要通过实践操作让开发人员更好的理解整个前端工程化的流程。 本文通过开发准备阶段、开发阶段和开发完成三个阶段开介绍vue前端工程化的整体过程。 准备阶段 准备阶段我将其分为&#xff1a;框架选择、规范制…

基于单片机HX711电子秤称重控制设计

**单片机设计介绍&#xff0c;基于单片机HX711电子秤称重控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机HX711的电子秤称重控制设计是一个融合了单片机技术、称重传感器技术和显示技术的综合性项目。其设计目…

C 语言贪吃蛇源码解析

贪吃蛇是一款经典的电子游戏&#xff0c;玩家控制一条不断成长的蛇&#xff0c;需要避免撞到自己的身体或者游戏边界&#xff0c;同时吃掉出现在屏幕上的食物以增长身体长度。 下面是一个简单的贪吃蛇游戏的C语言实现&#xff0c;使用了标准输入输出库conio.h和时间库windows.h…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按&#xff1a;英伟达2024 GTC 大会上周在美国加州召开&#xff0c;星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论&#xff0c;继上一篇《GTC 2024 火线评论&#xff1a;GPU 的高效存储利用》之后&#xff0c;这是他发回的第二篇评论文章。 上一篇文章…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集&#xff1a; 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

微服务demo(二)nacos服务注册与集中配置

环境&#xff1a;nacos1.3.0 一、服务注册 1、pom&#xff1a; 移步spring官网https://spring.io&#xff0c;查看集成Nacos所需依赖 找到对应版本点击进入查看集成说明 然后再里面找到集成配置样例&#xff0c;这里只截一张&#xff0c;其他集成内容继续向下找 我的&#x…

蓝桥杯刷题计划-洛谷-持续更新

P8598 [蓝桥杯 2013 省 AB] 错误票据 题目 #include <bits/stdc.h> #define endl \n #define int long long #define INF 0x3f3f3f3f3f const int N 1000010; using namespace std; int arr[N]; signed main() {int N;cin>>N;int idx;while(cin>>arr[idx…

数据库审计和安全

互联网、云计算、物联网等新技术的应用&#xff0c;数据安全面临前所未有的挑战!我国信息安全已从终端安全、网络安全&#xff0c;发展到数据安全建设阶段。数据安全的核心是对“数据”全方位的安全防护&#xff0c;其产品及解决方案直接涉及国家和企业的核心机密 核心数据库存…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述 在…

ES6学习之路:迭代器Iterator和生成器Generator

迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据&#xff0c;它不会在意有多少数据&#xff0c;也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…

linux nginx配置ssl, 实现https+ip访问

mkdir sslZhengShu openssl req -newkey rsa:2048 -nodes -keyout ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr 和之前输入一样即可 …

Python基本运算

1.逻辑运算符 第四行会有黄色的下划线是因为这个不是系统推荐的写法&#xff0c;系统推荐的是第五行的链式比较&#xff1b; 2.短路求值 对于and而言&#xff0c;左边的语句是false&#xff0c;那么整体一定是false,右边的表达式就不会进行计算&#xff1b; 对于or而言&…