2

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

TextView当系统时钟改变分钟而不检查每秒是否有这种变化时,是否有另一种方法来触发更新(或采取一般行动)?

4

4 回答 4

6

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

handler.postDelayed(runnable, 
        DateUtils.MINUTE_IN_MILLIS - System.currentTimeMillis % DateUtils.MINUTE_IN_MILLIS);

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

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

于 2013-01-29T18:45:42.273 回答
4

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

于 2013-01-29T18:59:26.120 回答
0

使用具有固定周期的 Timer 对象。

这些方法采用 TimerTask 对象。

请参阅google的Timer 文档

记住在停止活动时取消计时器

于 2013-01-29T18:50:38.320 回答
0

除了山姆的好答案之外,还有更漂亮的解决方案。

利用http://developer.android.com/reference/android/text/format/DateUtils.html查找时间跨度并注册android.intent.action.TIME_TICK您将在列表视图中更新时间的位置。

这是另一个相同的问题和答案

于 2013-01-29T19:02:03.497 回答