【问题标题】:Android - Timed UI events (with pause/resume)Android - 定时 UI 事件(带暂停/恢复)
【发布时间】:2010-07-03 13:49:38
【问题描述】:

我希望在 Android 上创建触发 UI 更改(如 Toast)的定时事件。我已经知道你可以使用 Handler 对象的 postDelayed(runnable, timeDelay) 方法 (see this page for a great example) 来做到这一点。

这里是转折点:我还需要能够暂停和恢复这些事件的倒计时。因此,当用户暂停屏幕计时器时,它也会在每个事件触发之前暂停倒计时。

想到的一种方法是在新的Thread(不是 UI 线程)上创建一个Handler 对象,并使用postDelayed 将我的事件排队;然后我会根据需要使用this method 暂停或恢复整个Thread 的执行。这里的主要问题是弄清楚如何让事件被触发后在 UI 线程上运行。

我能想到的唯一其他方法是检查计时器在 UI 线程上的所有事件(蛮力)列表中的每一秒,这非常混乱。

如果有人对此或解决方案有任何想法,那就太好了!

【问题讨论】:

  • 我刚刚尝试了带有处理程序的新线程,它给了我错误“无法在未调用 Looper.prepare() 的线程内创建处理程序”。所以看起来这种方法已经过时了。
  • 你在里面调用 Looper.prepare() 了吗? developer.android.com/reference/android/os/Looper.html

标签: java android timer handler


【解决方案1】:

如果所有事件都需要暂停相同的时间,您可以跟踪累积的暂停时间,并在 handleMessage 上使用具有该延迟时间的另一个 postDelayed 重新发布。

需要添加一些逻辑以确保将它们全部延迟适当的数量。例如,如果在游戏暂停时将新事件添加到队列中,您不希望在整个暂停量延迟后重新发布它。

您可以结合自己的想法(事件队列与所需的开始时间)。暂停结束时更新该开始时间。使用单个事件“processQueue” - 将其设置为仅在您认为应该发生下一个事件时触发。如果下一个事件应该发生的时间由于暂停而延迟,您可以删除“processQueue”事件并重新发布。

【讨论】:

  • 是的,我的所有活动都会暂停相同的时间。感谢您的帮助!您想出了一个看起来非常优雅的解决方案。
【解决方案2】:
  1. 为了能够在您自己的线程中使用处理程序,您需要有一个循环器,请参阅this 以获取示例
  2. 为了能够在 UI 线程中运行命令,您可以在自己的线程代码中传递处理程序引用,以便能够向其发布消息。
    希望对您有所帮助

【讨论】:

  • 谢谢!我之前并没有真正研究过 Looper 类,但它看起来是一个可能的解决方案。
【解决方案3】:

Handler#removeCallbacks 将允许您取消安排已发布的 Runnable。当您知道它应该运行的新时间时,您可以稍后再次发布它。

【讨论】:

  • 是的,但我必须知道原始可运行文件还剩下多少时间才能知道将其重新发布为什么。这与整个“一劳永逸”的想法并不太吻合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多