CountDownTimer

CountDownTimerCountDownTimer源码解析在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能作用可用于倒计时操作,内部采用Handler来实现的那我们来看一看它内部到底是如何实现?首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法构造函数publicCountDown…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

CountDownTimer源码解析

在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能

作用

  • 可用于倒计时操作,内部采用Handler来实现的
那我们来看一看它内部到底是如何实现?
  • 首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法

    • 构造函数

        public CountDownTimer(long millisInFuture, long countDownInterval) {
              mMillisInFuture = millisInFuture;
              mCountdownInterval = countDownInterval;
        }
      
      • millisInFuture: 设置倒计时的总时间(毫秒)
      • countDownInterval: 设置每次减去的时间(毫秒)
    • 创建对象

        mCountDownTimer = new CountDownTimer(Long.MAX_VALUE, 5000) {
                  @Override
                  public void onTick(long l) {
            
                  }
      
                  @Override
                  public void onFinish() {
                
                  }
              };
        mCountDownTimer.start();
      
    • onTick(long l):用于返回还剩余多长时间,每间隔一段时间回调一次

    • onFinish():当倒计时结束时回调

  • CountDownTimer通过start()来触发倒计时,那我们来看看里面是如何实现的

        /**
         * Start the countdown.
         */
        public synchronized final CountDownTimer start() {
            mCancelled = false;
            if (mMillisInFuture <= 0) {
                onFinish();
                return this;
            }
            mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
            mHandler.sendMessage(mHandler.obtainMessage(MSG));
            return this;
        }
    
    • 首先会判断设置的倒计时时间是否小于等于0,是的话直接回调onFinish()方法;反之计算倒计时结束时的时间(当前时间+总的倒计时时间);然后通过handle发送消息

       // 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 {
                   long lastTickStart = SystemClock.elapsedRealtime();
                   onTick(millisLeft);
      
                   // take into account user's onTick taking time to execute
                   long lastTickDuration = SystemClock.elapsedRealtime() - lastTickStart;
                   long delay;
      
                   if (millisLeft < mCountdownInterval) {
                       // just delay until done
                       delay = millisLeft - lastTickDuration;
      
                       // special case: user's onTick took more than interval to
                       // complete, trigger onFinish without delay
                       if (delay < 0) delay = 0;
                   } else {
                       delay = mCountdownInterval - lastTickDuration;
      
                       // special case: user's onTick took more than interval to
                       // complete, skip to next interval
                       while (delay < 0) delay += mCountdownInterval;
                   }
      
                   sendMessageDelayed(obtainMessage(MSG), delay);
               }
           }
          }
         };
      
    • 在Handle中我们首先会判断是否设置了mCancelled=true,若是的话直接不再处理,表示已经取消倒计时;反之,计算倒计时还剩余多少时间,若剩余时间<=0,则直接调用onFinish()表示倒计时结束;否则计算剩余时间时候大于设置每次减去的时间的时间,若是则发送延时消息,延时时间为mCountdownInterval,否则延时时间为剩余时间,这样就实现了倒计时的功能

  • CountDownTimer通过cancel()来取消倒计时

        /**
         * Cancel the countdown.
         */
        public synchronized final void cancel() {
            mCancelled = true;
            mHandler.removeMessages(MSG);
        }
    
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192024.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 引起cpu流水线阻塞的三个原因

    引起cpu流水线阻塞的三个原因1、多个任务在同一时间周期内争用同一个流水段(资源冲突)例如,假如在指令流水线中,如果数据和指令是放在同一个储存器中,并且访问接口也只有一个,那么,两条指令就会争用储存器;在一些算数流水线中,有些运算会同时访问一个运算部件。2、数据依赖(数据相关)比如,A运算必须得到B运算的结果,但是,B运算还没有开始,A运算动作就必须等待,直到A运算完成,两次运算不能同时执行。3、 条件转移的影响(条件转移)如…

    2022年8月20日
  • 回声状态网络基础知识_肝血管瘤内回声成网络样

    回声状态网络基础知识_肝血管瘤内回声成网络样http://jlearning.cn/2017/05/29/ESN-basic-tutorial/最近在看回声状态网络(EchoStateNetwork)的内容,注意到中文搜索引擎搜不到关于有关EchoStateNetwork通俗的讲解,打算写一下关于ESN的一个基本教程。本文先用一小段简单介绍ESN是什么,然后用公式来表示这种网络,并说明他的优缺点,最后用一个可执行的简单例子来演示…

    2022年10月21日
  • java 自行车_JAVA 2020款山地车盘点[通俗易懂]

    java 自行车_JAVA 2020款山地车盘点[通俗易懂]最近,笔者为大家带来了不少有关顶尖山地车型的文章,不少的观众老爷直呼看看就好,那今天我们就来看看入门山地车。JAVA作为近几年迅速崛起的国产品牌,推出的一系列产品中带着鲜明的“JAVA”风格。在山地市场上,JAVA主打入门车型,今天就让我们来看一看JAVA旗下的那些山地车。对啦,以下车型均可在JAVA旗舰店购买到哦。JAVAANIMA售价仅4500元的ANIMA采用JAVAADVANCENA…

    2022年7月7日
  • webpack最新版本是多少_webpack不是内部或外部命令

    webpack最新版本是多少_webpack不是内部或外部命令如何查看当前项目webpack版本在项目package.json中的scripts脚本命令中写入以下内容”webpack”:”webpack–version”然后打开终端在项目根路径下运行:npmrunwebpack…

    2022年8月10日
  • python之运算符

    运算符的定义运算符类型1.算数运算符2.比较运算符3.赋值运算符4.位运算符5.逻辑运算符6.成员运算符7身份运算符详情介绍1算数运算2比较运算3赋值运算4位运算:5逻辑运

    2022年3月29日
  • db4o发布7.2,出现.NET 3.5版本,支持LINQ「建议收藏」

    db4o发布7.2,出现.NET 3.5版本,支持LINQ「建议收藏」db4o发布7.2,出现.NET3.5版本,支持LINQDb4Object刚刚发布了db4o的7.2beta,除了以前支持如下的平台:.NET1.1,.NET2.0,Mono外,现在还支持.NET3.5了。当然支持.NET3.5,最主要的时候要来支持LINQ。关于LINQ,我稍后再讲。现在讲讲7.2中最大的新特性——TransparentActivation(透明…

    2022年7月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号