当系统时钟改变分钟时采取行动?

mra*_*tor 2 android runnable

我的 Android 应用程序TextView告诉用户数据年龄(“13 分钟前”)。我目前每秒更新一次,使用 aRunnable来捕捉当分钟更改notifyDataSetChanged()为我的适配器时。但这会导致每秒垃圾收集...

TextView当系统时钟每分钟发生变化时,是否有另一种方法来触发更新(或采取一般措施),而无需每秒检查此类变化?

Sam*_*Sam 6

由于您已经设置了 Runnable 和回调,因此使用 modulo 计算下一次更新应该发生的时间:

handler.postDelayed(runnable, 
        DateUtils.MINUTE_IN_MILLIS - System.currentTimeMillis % DateUtils.MINUTE_IN_MILLIS);
Run Code Online (Sandbox Code Playgroud)

这将在下一分钟发生时运行回调,无论是 59、30 还是 1 秒。请注意,如果 Runnable 只更新一个 TextView,不要忘记DateUtils.HOUR_IN_MILLIS在事件发生一小时时切换到,每分钟更新“1 小时前”是没有意义的。

您可能会发现类似的方法DateUtils.getRelativeTimeSpanString()可用于创建“x 分钟前”字符串。


Thr*_*bad 5

虽然 Sam 的答案非常好,但我只是添加这个,因为它非常适合这个问题。实际上,当时钟发生变化时,系统每分钟都会发送一次广播。是的Intent.ACTION_TIME_TICK,您只能使用BroadCastReceiver在代码中手动注册的 来接收它,而不是通过清单。请参阅此处的文档。