在我的小应用程序中,我从系统(不受我控制)收到一系列排队的 onEventXXX()。
不能保证那些 onEventXXX() 的时间。唯一可以保证的是,它们会按照放入队列的顺序接收。
在 onEventXXX() 内部,我必须触发一个操作 (O),该操作 在另一个进程 (P) 正在进行时无法启动。
但我不能就此放弃“触发操作 (O)”。我必须等到该进程 (P) 完成,然后触发它。
IOW,我必须排队或至少推迟“触发操作”,直到该过程 (P) 完成。
我实现这个的直接想法是,而不是触发操作 (O),我会:
- 启动一个一次性计时器,定期检查进程 (P)
- 当计时器结束时,如果过程 (P) 未完成,则重新开始计时(本身)。
- 当计时器到时,如果过程 (P) 完成,则触发操作 (O)。
但了解 Android 的丰富性后,我怀疑是否有更好的方法来执行此操作,该方法已内置到系统/API 中。
如果有更好的方法来实现以上,那会是什么?
最佳答案
CountDownLatch将是最好的解决方案。
我没有详细的例子,但我想你可以轻松使用它。
过程如下
- 定义 CountDownLatch 变量命名锁存器
- 将闩锁计数设置为 1
- 当收到事件 O 时,创建一个新的 ThreadO。在 ThreadO 中,等待直到锁存器的计数达到 0。
- 当进程 P 完成时,倒计时闩锁。
如果您这样编写代码,您可以轻松应对许多情况。
- 如果O先收到,可以等P完成。
- 如果 P 先收到,你可以立即启动 O。
- 您可以使用 CountDownLatch 提供的超时功能。
我在异步单元测试中使用 CountDownLatch。你可以在这里看到我的代码:http://kingori.egloos.com/4554640
虽然它不像你的情况,但你可以从我的代码中获取提示。此外,CountDownLatch 的 javadoc 提供了很好的示例。
关于android - 推迟 onEvent 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945900/