Android demo倒计时原理(CountDownTimer原理)

本文详细解析了Android中CountDownTimer类的工作原理及其实现方式,通过自定义MyCountDownTimer类展示了如何精确控制倒计时功能,并提供了一个具体的应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用绑定手机号功能,发送之后2分钟倒计时。
倒计时的功能用到了CountDownTimer类,这是android的一个工具类。很巧妙
下面是这个类的原理解析,此类比较简单。但很强大。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.example.democountdowntheory;

import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

public abstract class MyCountDownTimer {
    /*原理:
     * 随时用SystemClock.elapsedRealtime()获取时间,使用这个时间来精确倒计时的数值
     * 其他比较简单看看就明白了
     * */

    private static final int MSG = 1;
    private long mSetTotalTime;// 总的时间120000,120秒
    private long mSetDownValue;// 减少的值1000,1秒

    public MyCountDownTimer(long totalTime, long downValue) {
        this.mSetTotalTime = totalTime;
        this.mSetDownValue = downValue;
    }

    /**
     * 启动
     */
    public final synchronized MyCountDownTimer  start() {
        if (mSetTotalTime <= 0) {
            onFinish();
            return this;
        }

        mStartTime = SystemClock.elapsedRealtime() + mSetTotalTime;// 开始的时间+开机到现在的时间
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        return this;

    };

    /**
     * 变化的值
     */
    public abstract void onTick(long remain);

    public void cancel() {
        mHandler.removeMessages(MSG);
    }

    /**
     * 结束之后
     */
    public abstract void onFinish();

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            synchronized (MyCountDownTimer.this) {

                long remain = mStartTime - SystemClock.elapsedRealtime();// 减少后,剩余的时间。
                if (remain <= 0) {
                    onFinish();// 完成
                } else if (mSetTotalTime < mSetDownValue) {
                    // 设置的值<down减少的值
                    sendMessageDelayed(obtainMessage(MSG), remain);
                } else {
                    // 减少操作
                    long pre = SystemClock.elapsedRealtime();
                    onTick(remain);// 将值回调,供用户使用
                    long delay = pre + mSetDownValue
                            - SystemClock.elapsedRealtime();
                    while (delay < 0) {
                        delay += mSetDownValue;
                    }
                    sendMessageDelayed(obtainMessage(MSG), delay);
                }
            }
        };

    };
    private long mStartTime;

}

图片说明文字
demo地址:http://download.youkuaiyun.com/detail/pangzaifei/7006651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值