博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从Chronometer中学习控件中的定时器生命周期
阅读量:5897 次
发布时间:2019-06-19

本文共 1913 字,大约阅读时间需要 6 分钟。

Android 提供了一个计时器组件Chronometer ,在原来某些需要倒计时的界面中,完全不需要自己去实现一个。

Chronometer 的用法比较简单,就不浪费时间了。 看看Chronometer怎么实现定时更新时间(改变UI效果)的,在以后自定义某些定时执行UI更新的控件时(指的是你的定时Banner定时上下滚动的公告条)可以参考,不会又去用Handler + Runnable 或者 Timer + Task了。

(题外话1. 当然postDelayed()底层也是用的Handler来完成的,但是这个Handler就不需要我们手动再创建一次了。 题外话2. ,API 19的时候Chronometer就是用Handler + Runnable实现的,API 25的时候就不是了)

怎么定时改变UI效果

start() 方法开始查看,调用了updateRunning()一下。在updateRunning()一系列判断,满足条件后在updateText()setText()设置文字,接着postDelayed()一个Runnable。在Runnable里同样进行判断 ,更新文本+postDelayed()....通过这样就形成了定时改变UI效果。

什么时机去启动和停止这个定时器?

private void updateRunning() {        boolean running = mVisible && mStarted;        if (running != mRunning) {            if (running) {                updateText(SystemClock.elapsedRealtime());                dispatchChronometerTick();                postDelayed(mTickRunnable, 1000);            } else {                removeCallbacks(mTickRunnable);            }            mRunning = running;        }    }复制代码

上面的是updateRunning()方法,代码简单易懂,首先判断了是否可见是是否开启,是否开启就不看了。看这个mVisible是那些情况下会发生改变。

  1. onDetachedFromWindow
@Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        mVisible = false;        updateRunning();    }复制代码
  1. onWindowVisibilityChanged(int)
@Override    protected void onWindowVisibilityChanged(int visibility) {        super.onWindowVisibilityChanged(visibility);        mVisible = visibility == VISIBLE;        updateRunning();    }复制代码

没有比这还清晰明了的代码了。 在ViewWindow分离的时候,mVisible = false, 在Window可见度发生改变的时候mVisible = visibility == VISIBLE; 系统提供的还有一个onAttachedToWindow()方法则没有重写。

那么此时用语言来形容定时器的开启与关闭。 0. 定时器任务(Runnable),作为成员变量在View创建的时候直接创建

  1. View 销毁时 ,停止定时器
  2. 在可见度发生改变的时候
    1. 如果View不可见,停止定时器
    2. 如果View可见,恢复定时器

这个Chronometer可能是最简单易懂的控件了。

Chronometer 的时间格式处理 (HH:mm:ss)

updateText()中通过DateUtils.formatElapsedTime()来对传入的字符串毫秒值(确切的说应该是秒值)进行格式化. 传入数值265009 返回文本73:36:49

转载于:https://juejin.im/post/5a31ee4ef265da4321540e39

你可能感兴趣的文章
用ATL开发和部署ActiveX网页控件
查看>>
两个有用Oracle运算:intersect和minus运算
查看>>
IIS与ASP.NET中的队列
查看>>
shell 脚本实战笔记(2)--环境变量PATH的恩怨情仇
查看>>
Radix-64编码简介
查看>>
unicode 编码在线转换--javascript
查看>>
前端神器avalonJS入门(一)
查看>>
老机器安装Centos
查看>>
不同浏览器对终止脚本执行有不同的判断标准:
查看>>
c++ map
查看>>
代码阅读分析工具Understand 2.0试用
查看>>
DirectFB编程
查看>>
管理之道(六) - 看学历更要看能力
查看>>
JavasSript实现秒转换为“天时分秒”控件和TDD测试方法应用
查看>>
VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)...
查看>>
linux入门教程(二) 图形界面还是命令窗口
查看>>
Linux基础命令
查看>>
***ps -ef |grep 输出的具体含义是什么?
查看>>
WordPress给网站添加支付宝捐赠功能
查看>>
手机网页布局经验总结
查看>>