zoukankan      html  css  js  c++  java
  • Android 经典笔记之七:CountDownTimer解读

    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
  • 相关阅读:
    操作系统概念(第十一章) 文件系统实现
    Linux内核中网络数据包的接收-第一部分 概念和框架
    【技术文档】jeecg3.7-maven搭建好开发环境入门
    memcache源码编译安装
    Linux系统级日志系统
    shell流程控制
    EOF多行写入文件防止变量替换
    zip压缩解压
    shell变量的截取总结
    对linux安装中文字体库
  • 原文地址:https://www.cnblogs.com/yc211/p/7688409.html
Copyright © 2011-2022 走看看