Android 进阶之路Android开发程序员

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

2017-06-30  本文已影响125人  Tyhoo_Wu

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

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

跟上我的步伐,以正确的姿势实现在 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" />

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

所以我们要将 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

上一篇 下一篇

猜你喜欢

热点阅读