美文网首页
从Chronometer中学习控件中的定时器生命周期

从Chronometer中学习控件中的定时器生命周期

作者: pdog18 | 来源:发表于2017-08-13 22:12 被阅读178次

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()方法则没有重写。

那么此时用语言来形容定时器的开启与关闭。

  1. 定时器任务(Runnable),作为成员变量在View创建的时候直接创建
  2. View 销毁时 ,停止定时器
  3. 在可见度发生改变的时候
    1. 如果View不可见,停止定时器
    2. 如果View可见,恢复定时器

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

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

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

相关文章

  • 从Chronometer中学习控件中的定时器生命周期

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

  • JetPack_Lifecycle

    假设有 Chronometer 这个控件,要求在Activity不同的生命周期实现start()或者 stop()...

  • Android 正计时0.0

    Android 正计时 控件 Android 正计时控件---Chronometer用起来特别简单,1在xml文件...

  • Vue组件中的定时器销毁问题

    方法一: 在data函数中定义定时器名称: 然后这样使用定时器: 最后在beforeDestroy()生命周期内清...

  • vue路由跳转后计时器还在执行

    情景描述 在组件a中设置了定时器,当路由跳转加载组件b后,a中的定时器依然在执行。 解决方法: 在组件a的生命周期...

  • Chronometer 定时器

    Chronometer是一个简单的定时器,可以通过setBase()来给它一个基准时间,并从该时间开始计数;如果不...

  • 浅谈Windowsphone中动画编程的实现方式

    Windowsphone中动画编程的实现方式 方法一:基于定时器的实现 例: 在界面中添加一个Buton控件,动画...

  • Cocos2dx Lua中常用函数

    导入编辑器生成的lua文件 从studio导入文件中获取对应的控件 定时器 触摸的回调函数 按键监听函数,code...

  • 事件传递和响应机制

    iOS中的事件 1.事件的生命周期 事件的生命周期从事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的...

  • iOS事件的传递和响应机制

    iOS中的事件 事件的生命周期 事件的生命周期从事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的vi...

网友评论

      本文标题:从Chronometer中学习控件中的定时器生命周期

      本文链接:https://www.haomeiwen.com/subject/hxesrxtx.html