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);
        }
    
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 右下面弹出框实现代码

    右下面弹出框实现代码

  • linux系统nginx启动_电脑更新时重启电脑会怎样

    linux系统nginx启动_电脑更新时重启电脑会怎样Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多。下面是下载地址http://nginx.org/en/download.html安装过程需要对Linux网络和配置yum源的知识比较熟悉下载下来并传入到服务器。第一步是进行解压tar-zxvfnginx-1.13.1

  • 数据结构与算法二叉树的算法_数据结构c语言二叉树的深度

    数据结构与算法二叉树的算法_数据结构c语言二叉树的深度一、什么是二叉树1.概述首先,需要了解树这种数据结构的定义:树:是一类重要的非线性数据结构,是以分支关系定义的层次结构。每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且

  • hdfs的八大安全和可靠策略总结和设计基础与目标[通俗易懂]

    hdfs的八大安全和可靠策略总结和设计基础与目标[通俗易懂]hdfs的八大安全和可靠策略总结和设计基础与目标

  • 进程池及回掉函数[通俗易懂]

    进程池在说进程池之前先来说一个概念:数据共享数据共享1.进程间的通信应该尽量避免共享数据的方式2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的。虽然进程间数据独立

  • Python:暴力激活成功教程密码

    Python:暴力激活成功教程密码简介:暴力激活成功教程密码的方式一般是枚举法进行破译尝试,通过一次次不同的输入尝试从而得出最终的密码,所以密码的长度和复杂性就尤为重要。本文仅以范例,警示大家在创建密码的时候,应当尽量选择组合复杂度高的,有一定长度的密码,而不是123456之类的简单密码。激活成功教程的思路:1、获取目标密码长度,一般为4,6,12,15,18位长度。2、获取目标密码组成的范围,一般为数字,小写字母,大写字母,特殊符号3、组装密码,通过itertools模块组装。Python:常见排列组合问题处理4、枚举破译。例如生活中最常见的

发表回复

您的电子邮箱地址不会被公开。

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