美文网首页
从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中学习控件中的定时器生命周期

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