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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 画图板小程序

    画图板小程序

    2021年9月9日
    80
  • PDAF_pdaft模型

    PDAF_pdaft模型相位检测、自动对焦、激光、红外线、更高的像素……现在,出现在智能手机上的摄像技术已经越来越先进,并且每个厂商都在不断的尝试创新,追求比竞争对手们拥有更好的拍照效果。三星从Galaxy S5开始使用了PDAF技术,而LG则向我们展示了激光自动对焦,还有联想在最新的Vibe Shot系列产品上带来了红外对焦系统,而索尼更是准备好将自己已经非常领先的摄像头技术使用到智能手机上。但是,究竟

    2022年9月7日
    0
  • java常量池和字符串常量池_java声明常量

    java常量池和字符串常量池_java声明常量本篇文章带大家认识Java基础知识——字符串类,在前面我们已经知道如何在Java中定义字符串,本文将介绍Java字符串中的字符串常量池,探究字符串相等问题。

    2022年7月28日
    8
  • gtest参数化_gopro三折杆教程

    gtest参数化_gopro三折杆教程1前言使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。2 基本介绍前面提到,对于运行参数,gtest提供了三种设置的途径:系统环境变量命令行参数代码中指定FLAG因为提供了三种途径,就会有优先级的问题,有一个原则是,最后…

    2022年9月28日
    0
  • 简单LMDB用法_法语简单过去时用法

    简单LMDB用法_法语简单过去时用法装载请注明出处

    2022年9月29日
    0
  • js禁止浏览器后退按钮[通俗易懂]

    js禁止浏览器后退按钮[通俗易懂]js禁止浏览器后退按钮1.js//禁止浏览器后退按钮functionBanBack(ele){//禁止浏览器后退按钮if(window.history&amp;&amp;window.history.pushState){$(window).on(‘popstate’,function(){window.histo…

    2022年7月25日
    6

发表回复

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

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