关于“实时显示系统时间”这类示例在网上一搜一大片,那么我为啥还要新写一篇?
网上的雷同示例代码太多了。
我很想知道雷同示例代码的原著是谁?你写的玩意验证过?都发生内存泄露了还发表到网上。
跟上我的步伐,以正确的姿势实现在 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
经过测试,我们的程序没有出现 Leaked Activities 。证明无内存泄漏。
项目示例代码已上传至 GitHub ,欢迎学习。THX!
https://github.com/cnwutianhao/SystemClockSample/blob/master/app/src/main/java/com/haocent/android/systemclocksample/MainActivity.java
网友评论