CountDownTimer(倒计时计数器)
  • 1.1 介绍
  • 1.2 参数
  • 1.3 公共方法
  • 1.4 使用方法
  • 1.5 源码分析

**0.本人写的综合案例**
[案例](https://github.com/yangchong211/LifeHelper)
[说明及截图](https://github.com/yangchong211/LifeHelper/blob/master/README.md)
模块:新闻,音乐,视频,图片,唐诗宋词,快递,天气,记事本,阅读器等等
接口:七牛,阿里云,天行,干货集中营,极速数据,追书神器等等

  • 介绍:定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。
  • 参数
millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒)
countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)
  • 公共方法
public final void cancel ()
取消倒计时(取消后,再次启动会重新开始倒计时)
 
public abstract void onFinish ()
倒计时完成时被调用
 
public abstract void onTick (long millisUntilFinished)
固定间隔被调用
参数 millisUntilFinished 倒计时剩余时间。
 
public synchronized final CountDownTimer start ()
启动倒计时
  • 使用方法
CountDownTimer timer = new CountDownTimer(30000, 1000) {
    public void onTick(long millisUntilFinished) {
 
    }
 
    public void onFinish() {
        Intent intent = new Intent(GuideActivity.this, TimerReceiver.class);
        intent.setAction("timer");
    }
}.start();
  • 源码分析
    • 基本结构如下所示: CountDownTimer 这个类的基本结构(红色标明的为关键处,蓝色标明的为抽象函数,我们使用时必须进行实现)
    • 功能实现的关键部分在于 mHandler,下面我们来看一看 mHandler 的源码:
// 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 if (millisLeft < mCountdownInterval) {
                // no tick, just delay until done
                sendMessageDelayed(obtainMessage(MSG), millisLeft);
            } else {
                long lastTickStart = SystemClock.elapsedRealtime();
                onTick(millisLeft);
                // take into account user's onTick taking time to execute
                long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
                // special case: user's onTick took more than interval to
                // complete, skip to next interval
                while (delay < 0) delay += mCountdownInterval;
                sendMessageDelayed(obtainMessage(MSG), delay);
            }
        }
    }
};
    • 主要在处理对 millisLeft 剩余时间的判断,其中 delay 的处理需要注意,当 onTick() 方法耗时过长时会进行跳过,可以用如下的流程图来表示整个流程:
    • synchronized 关键字
      • 值得注意的是,源码中 cancle(), start() 函数被 synchronized 修饰,mHandler.handleMessage(Message msg) 中代码段也被 synchronized 修饰,它主要是用来保证在同一时刻,至多只有一个线程执行该段代码
      • 主要有以下两个特点:
        1. 当有一个线程访问某具体对象的一个被 synchronized 修饰的代码区域时,其它线程对该具体对象中所有被 synchronized 修饰的代码区域的访问都会被阻塞。
        2. 当有一个线程访问某具体对象的一个被 synchronized 修饰的代码区域时,其它线程对该具体对象中没有被 synchronized 修饰的代码区域的访问仍会正常进行。

知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
领英:https://www.linkedin.com/in/chong-yang-049216146/
简书:http://www.jianshu.com/u/b7b2c6ed9284
csdn:http://my.csdn.net/m0_37700275
网易博客:http://yangchong211.blog.163.com/
新浪博客:http://blog.sina.com.cn/786041010yc
github:https://github.com/yangchong211
喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
脉脉:yc930211
360图书馆:http://www.360doc.com/myfiles.aspx
开源中国:https://my.oschina.net/zbj1618/blog
泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
邮箱:yangchong211@163.com
阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100239.headeruserinfo.3.dT4bcV

Android 经典笔记之七:CountDownTimer解读的更多相关文章

  1. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  2. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  3. 【转】Pro Android学习笔记(二三):用户界面和控制(11):其他控件

    目录(?)[-] Chronometer计时器控件 倒计时CountDownTimer Switch控件 Space控件 其他控件 Android提供了很多控件,基本上都是view的扩展. Chron ...

  4. android 应用笔记

    android 应用笔记 android 应用笔记 小书匠 Android 综合教程 Android常用技巧 安卓系统架构 安卓源码开发 安卓驱动 Linux内核 安卓应用开发 Java 教程 tic ...

  5. Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...

  6. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  7. Android开发笔记:打包数据库

    对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...

  8. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  9. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  10. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

随机推荐

  1. 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)

    第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...

  2. ASP.NET Core分布式项目实战(Identity Server 4回顾,Consent 实现思路介绍)--学习笔记

    任务17:Identity Server 4回顾 上一节我们中间留了一部分,登录之后的 RequireConsent,就是用户授权这一步没有做,直接跳过,这种情况可以理解为我们自己比较信任的客户端,这 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (197)-- 算法导论14.3 5题

    五.用go语言,对区间树 T 和一个区间 i ,请修改有关区间树的过程来支持新的操作 INTERVALSEARCH-EXACTLY(T,i) ,它返回一个指向 T 中结点 x 的指针,使得 x.int ...

  4. Git将某个文件合并到指定分支

    企业开发中,经常会单独拉分支去做自己的需求开发,但是某些时候一些公共的配置我们需要从主线pull,这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <br ...

  5. jsp中无法识别EL表达式问题

    今天在开发系统时需要在JSP中遍历List<javabean>,其中用到了EL表达式:${item.value} 页面死活不出数据,只显示表达式本身:${item.value}. 页面代码 ...

  6. Spring rce CVE-2022-22965

    原理大致是这样:spring框架在传参的时候会与对应实体类自动参数绑定,通过"."还可以访问对应实体类的引用类型变量.使用getClass方法,通过反射机制最终获取tomcat的日 ...

  7. 解决VMware与win10无法共享目录

    1.安装VMware Tools 这一步适用于多数情况,但对于高版本的VMWare这一步无效,当然了,先试一试总没有坏处. 有看见网上说如果VMware内安装的是高版本的Ubuntu,安装的VMwar ...

  8. Redis原理再学习03:数据结构-链表 list

    链表list介绍 1. 链表list简介 链表(linked list)是一种基础数据结构,是一种线性表,但是不会按照线性表的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 链表插入节点时是 ...

  9. nuxt调用weixin-js-sdk

    在nuxt中调用weixin-js-sdk与在vue中有所不同. 通常在vue中用 import wx from 'weixin-js-sdk' 调用weixin-js-sdk,但在nuxt中会出现w ...

  10. 内存管理机制 & 垃圾回收机制

    内存管理机制 python是由c开发出来的. 看源码分析,下载python安装包tar包 解压后主要看Include和Objects这两个文件夹 # 分析 在创建对象时,如 v = 0.3 源码内部: ...