美文网首页Android 进阶之路Android开发程序员
【 Android 】Android UI 实时显示系统时间(无

【 Android 】Android UI 实时显示系统时间(无

作者: Tyhoo_Wu | 来源:发表于2017-06-30 00:41 被阅读125次

    关于“实时显示系统时间”这类示例在网上一搜一大片,那么我为啥还要新写一篇?

    网上的雷同示例代码太多了。
    我很想知道雷同示例代码的原著是谁?你写的玩意验证过?都发生内存泄露了还发表到网上。

    跟上我的步伐,以正确的姿势实现在 UI 上实时显示系统时间并且无 Memory Leak 的代码。

    先看示例图:


    1.png

    通过示例图我们可以清晰地看到系统时间已经正确的显示到 UI 上。

    代码实现:

    将时间显示到 UI ,类似将文字显示到 UI 。但是我们不直接将 TextView 控件放到 UI 上,而是封装一个显示系统时间的类,即 TvClockWidget 。在调用的时候启动它以更新线程 start(),否则就将其关闭以停止更新线程 stop()(防止内存泄漏)。

    // 初始化 Timer 和 Hander
    private Timer timer;
    private Handler handler = new Handler();
    
    public void start() {
        if (timer == null) {
            timer = new Timer();
        }
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                final String time = DateUtils.formatDateTime(getContext(), System.currentTimeMillis(),
                        DateUtils.FORMAT_SHOW_TIME);
                if (!time.equals(lastTime)) {
                    handler.post(new Runnable() {
                        public void run() {
                            timeView.setText(time);
                        }
                    });
                    lastTime = time;
                }
            }
        }, 0, 1000); // every second
    }
    
    public void stop() {
        timer.cancel();
        timer = null;
    }
    

    类的方法写好之后,就是布局界面的调用:

    <com.haocent.android.systemclocksample.TvClockWidget
        android:id="@+id/clock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:alpha="0.7" />
    

    布局也写好了,那么就是要判断什么时候启动它,什么时候关闭它。
    通过分析,当带时间的这个界面不在最上层显示的时候,我们就将其关闭,以防止发生内存泄漏。当界面在最上层的时候我们就将其显示出来。也就是根据生命周期进行显示与销毁。
    我们都知道

    • onCreate() 和 onStop() 是一组
    • onStart() 和 onDestory() 是一组
    • onResume() 和 onPause() 是一组

    所以我们要将 start() 方法在 onCreate() 或 onStart() 或 onResume() 中进行调用,将 stop() 方法在 onStop 或 onDestory() 或 onPause() 中进行调用。
    即:

    @Override
    protected void onPause() {
        super.onPause();
        mTvClockWidget.stop();
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        mTvClockWidget.start();
    }
    

    代码写好之后就是测试:
    通过 Android Studio 自带的内存泄漏检测工具 (感叹一下 Android Studio 越来越强大了!),我们就可以判断我们写的程序是否发生内存泄漏。
    Android 官网对检测内存泄漏检测的使用方法:
    https://developer.android.google.cn/studio/profile/am-hprof.html

    2.png
    经过测试,我们的程序没有出现 Leaked Activities 。证明无内存泄漏。

    项目示例代码已上传至 GitHub ,欢迎学习。THX!
    https://github.com/cnwutianhao/SystemClockSample/blob/master/app/src/main/java/com/haocent/android/systemclocksample/MainActivity.java

    相关文章

      网友评论

      • QiuJay:不是有个 TextClock 吗。
        Tyhoo_Wu:嗯,实现的方式有很多种,本文主要是强调 内存泄漏 这件事:blush:
      • Turaiiao:很好的文章,学习了
        Tyhoo_Wu:@寒湘 感谢支持

      本文标题:【 Android 】Android UI 实时显示系统时间(无

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