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


相关推荐

  • upx脱壳日记[通俗易懂]

    upx脱壳日记[通俗易懂]一、静态方法upx-d有时候可能会失败,需要切换使用正确的UPX版本。Windows下内置对各UPX版本的第三方图形化界面UPXShell工具,可以方便的切换版本,通过go按钮,可以切换upx加壳版本与脱壳版本二、动态方法(手脱)虽然UPX本身可以脱壳,但是UPX是基于加壳后可执行文件内存储的标识来查找并操作的,由于UPX是开源的,软件保护者可以随意修改这些标识,从而导致官方标准版本的UPX脱壳失败。因为UPX中可以改动的地方太多,所以人们在这种情况下一般采用动态脱壳x86的..

    2022年7月12日
    26
  • jvm之java类加载机制和类加载器(ClassLoader)的详解

    jvm之java类加载机制和类加载器(ClassLoader)的详解当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。一、类加载过程1.加载加载指的是将类的class文件…

    2022年6月10日
    36
  • Oracle cursor_sharing 参数 详解

    Oracle cursor_sharing 参数 详解

    2022年2月22日
    45
  • Java LDAP统一身份认证

    不多说直接看代码,如下:importjava.util.Hashtable;importjavax.naming.AuthenticationException;importjavax.naming.Context;importjavax.naming.NamingEnumeration;importjavax.naming.NamingException;import…

    2022年4月6日
    63
  • iconfont 使用

    iconfont 使用1 获取在线地址 进入 iconfont 网站图标管理 使用方法 DOCTYPE tml htmllang en head metacharset UTF 8 title Document title style fon style metacharset UTF 8 head htmllang en

    2025年10月10日
    1
  • Linux vi命令编辑文件「建议收藏」

    Linux vi命令编辑文件「建议收藏」进入vi编辑模式:vi文件名进入编辑:按i键编辑完按Esc退出编辑模式此时输入::wq保存后退出:wq!强制保存后退出:w保存但不退出:q不保存并退出:q!不保存并强制退出(比如报错时E212:Can’topenfileforwriting)…

    2022年9月22日
    3

发表回复

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

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