zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android 经典笔记之八:CountDownTimer解读

Android经典笔记 解读 之八
2023-09-27 14:27:26 时间

0.本人写的综合案例
案例
说明及截图
模块:新闻,音乐,视频,图片,唐诗宋词,快递,天气,记事本,阅读器等等
接口:七牛,阿里云,天行,干货集中营,极速数据,追书神器等等

1.1介绍:
定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。
1.2参数:
millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒)
countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)
1.3公共方法

public final void cancel ()
取消倒计时(取消后,再次启动会重新开始倒计时) public abstract void onFinish ()
倒计时完成时被调用 public abstract void onTick (long millisUntilFinished)
固定间隔被调用 参数 millisUntilFinished 倒计时剩余时间。 public synchronized final CountDownTimer start ()
启动倒计时

1.4使用方法

CountDownTimer timer = new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {

 public void onFinish() {

 Intent intent = new Intent(GuideActivity.this, TimerReceiver.class);

 intent.setAction("timer");

}.start();

源码分析

基本结构如下所示: CountDownTimer 这个类的基本结构(红色标明的为关键处,蓝色标明的为抽象函数,我们使用时必须进行实现)
Image.png 功能实现的关键部分在于 mHandler,下面我们来看一看 mHandler 的源码:
// 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 if (millisLeft mCountdownInterval) {

 // no tick, just delay until done

 sendMessageDelayed(obtainMessage(MSG), millisLeft);

 } else {

 long lastTickStart = SystemClock.elapsedRealtime();

 onTick(millisLeft);

 // take into account users onTick taking time to execute

 long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();

 // special case: users onTick took more than interval to

 // complete, skip to next interval

 while (delay 0) delay += mCountdownInterval;

 sendMessageDelayed(obtainMessage(MSG), delay);

};
主要在处理对 millisLeft 剩余时间的判断,其中 delay 的处理需要注意,当 onTick() 方法耗时过长时会进行跳过,可以用如下的流程图来表示整个流程:
Image.png

synchronized 关键字

值得注意的是,源码中 cancle(), start() 函数被 synchronized 修饰,mHandler.handleMessage(Message msg) 中代码段也被 synchronized 修饰,它主要是用来保证在同一时刻,至多只有一个线程执行该段代码

主要有以下两个特点:

当有一个线程访问某具体对象的一个被 synchronized 修饰的代码区域时,其它线程对该具体对象中所有被 synchronized 修饰的代码区域的访问都会被阻塞。 当有一个线程访问某具体对象的一个被 synchronized 修饰的代码区域时,其它线程对该具体对象中没有被 synchronized 修饰的代码区域的访问仍会正常进行。
Android Jetpack Compose——一个简单的笔记APP 此项目功能较为简单,基本就是使用Room数据库实现CRUD,但是此项目实现了一个干净的架构,项目使用MVVM架构进行设计,每一个模块的职责划分清晰,功能明确,没有冗余的代码。其中涉及了Hilt依赖注入,对于数据库的的操作,使用接口实现类进行获取,然后将实现类的CRUD操作封装在一个数据类中,最后通过Hilt自动注入依赖,供外部调用。
利用Android中自带的CountDownTimer实现手机验证码倒计时 public class TimeCountUtil extends CountDownTimer { private static final int TIME_TA...
1. CountDownTimer 介绍: 定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。 参数: millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。