在项目开发的中经常会遇到使用Timer计时器的时候。例如:活动倒计时、定时隐藏View、计时停止播放等等。提到上述场景在脑海中浮现的往往是Timer+TimerTask;CountDownTimer;Handler。没错这些类都可以很好的完成计时任务,但是在一些场景中往往开发出来的计时器会被系统回收导致计时不准确。例如:Activity中添加了CountDownTimer计时器,Activity在前台的时候计时器可以正常运行,但放置后台一段时间会发现计时器无法继续回调。我相信很多朋友都遇到过这样的问题,并为之烦恼良久。
为了解决计时器放置后台导致无法正常计时的问题。首先要考虑的是如何将计时器放置后台不会被系统GC掉,在Android中不能被系统回收的首选组件当然是Service服务。为什么选择Service不过多描述,不明白的小伙伴可以参考官方文档:服务概览 | Android 开发者 | Android Developers
计时器中需要有定时迭代的对象来计算时间。这个重任就落在了Handler身上。Handler中有设置间隔时间发送Message消息的sendEmptyMessageDelayed方法。可以通过它间隔一段时间计算一次时间。代码如下:
@SuppressLint("HandlerLeak")
inner class TimerHandler : Handler() {
var isRunning: Boolean = false
var isCallback: Boolean = false
@SuppressLint("SuspiciousIndentation")
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
//系统时间
currentSystemTime = SystemClock.elapsedRealtime() / 1000L
//计算回调
if (isCallback) {
updateShowTime()
}
if (isRunning) {
timerHandler.sendEmptyMessageDelayed(0, 250)
}
}
}
通过代码看到在TimerHandler中还有两个成员对象:isRunning、isCallback。
- isRu