我在我的应用程序中使用 Otto 作为事件总线。我浏览了 square.github.io/otto。它说“发布到总线是一个同步操作,因此当程序继续执行时,可以保证所有订阅者都已被调用。” 我很好奇为什么它不提供异步发布。如果我们只有同步发布,性能是否会成为问题?这是否意味着总线事件的接收者应该通过使用其他异步任务或线程来考虑性能问题以防止阻塞一切?
谢谢。
一个有意的设计决定是避免线程化。允许从其他线程发布将不允许 Otto 具有可预测的事件传递顺序。这增加了 Otto 的复杂性,这与主要的设计决策之一 - 库的简单性相矛盾。
如果您愿意,您可以查看Eric Burke 的演示文稿,他对此进行了解释(大约 32:10)。
也不应该有性能问题。只需在后台线程中执行所有长时间运行的任务,然后post()
从主线程更新回Bus
. 有很多方法可以做到这一点,例如Activity.runOnUiThread()
,AsyncTask.onPostExecute()
或Handler.post()
。
我很好奇为什么它不提供异步发布
你需要问奥托的作者这个问题。其他任何人都只能提供意见,这对于 StackOverflow 来说是题外话。
这是否意味着总线事件的接收者应该通过使用其他异步任务或线程来考虑性能问题以防止阻塞一切?
这取决于:
您从哪个线程发布事件(例如,如果它是从后台线程发布的,问题可能会更少)
响应事件应该做哪些工作
这与 Android 中的其他任何事情没有显着不同:作为开发人员,您需要知道将调用哪个线程以及您计划在该线程上花费多少时间,以便知道您是否需要做某事使这项工作异步与否。
IOW,Otto 解决了路由事件的问题,但线程仍然取决于您。这是 greenrobot 的 EventBus 提供更多选择的一个领域。