android countdown 按钮,Android 经典笔记:CountDownTimer解读

原标题:Android 经典笔记:CountDownTimer解读

新媒体管家

1.1介绍:

定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。

1.2参数:

millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒) countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)

1.3公共方法

public final void cancel () 取消倒计时(取消后,再次启动会重新开始倒计时)

public abstract void onFinish () 倒计时完成时被调用

public abstract void onTick (long millisUntilFinished) 固定间隔被调用

参数 millisUntilFinished 倒计时剩余时间。

public synchronized final CountDownTimer start () 启动倒计时

1.4使用方法

CountDownTimer timer = newCountDownTimer( 30000, 1000) { publicvoidonTick(longmillisUntilFinished){ } publicvoidonFinish(){ Intent intent = newIntent(GuideActivity. this, TimerReceiver.class); intent.setAction( "timer"); }}.start();

源码分析

基本结构如下所示: CountDownTimer 这个类的基本结构(红色标明的为关键处,蓝色标明的为抽象函数,我们使用时必须进行实现)

dc2caed7c65eee2e1a1f38a387b68a74.png

功能实现的关键部分在于 mHandler,下面我们来看一看 mHandler 的源码:

// handles counting down

privateHandler mHandler =

newHandler() {

@Override

publicvoidhandleMessage(Message msg){

synchronized(CountDownTimer.

this) {

if(mCancelled) {

return; }

final

longmillisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

if(millisLeft <=

0) { onFinish(); }

else

if(millisLeft < mCountdownInterval) {

// no tick, just delay until donesendMessageDelayed(obtainMessage(MSG), millisLeft); }

else{

longlastTickStart = SystemClock.elapsedRealtime(); onTick(millisLeft);

// take into account user's onTick taking time to execute

longdelay = 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() 方法耗时过长时会进行跳过,可以用如下的流程图来表示整个 流程:

f30571a4c75a7067a64d74bf8827f036.png

synchronized 关键字

值得注意的是,源码中 cancle(), start() 函数被 synchronized 修饰,mHandler.handleMessage(Message msg) 中代码段也被 synchronized 修饰,它主要是用来保证在同一时刻,至多只有一个线程执行该段代码

主要有以下两个特点:

当有一个线程访问某具体对象的一个被synchronized修饰的代码区域时,其它线程对该具体对象中所有被synchronized修饰的代码区域的访问都会被阻塞。

当有一个线程访问某具体对象的一个被synchronized修饰的代码区域时,其它线程对该具体对象中没有被synchronized修饰的代码区域的访问仍会正常进行。

来自:开源中国

https://my.oschina.net/zbj1618/blog/1551523

程序员大咖整理发布,转载请联系作者获得授权返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值