我在我的应用程序中使用Otto作为事件总线。我去了square.github.io/otto。它说'发布到总线是一个同步动作,因此当程序执行继续时,保证所有用户都被调用。'我很好奇为什么它不提供异步发布。如果我们只有同步发布,那么性能是否会成为一个问题?是否意味着总线事件的接收者应该通过使用其他异步任务或线程来考虑性能问题,以防止阻塞所有内容?
感谢。
答案 0 :(得分:7)
故意的设计决定是避免线程化。允许从其他线程发布将不允许Otto具有可预测的事件传递顺序。这增加了Otto的复杂性,这与主要的设计决策 - 图书馆的简单性相矛盾。
如果你愿意,你可以看到presentation of Eric Burke解释这个问题(大约32:10)。
也应该没有性能问题。只需在后台线程中执行所有长时间运行的任务,然后post()
从主线程更新回Bus
。有很多种方法可以实现Activity.runOnUiThread()
,AsyncTask.onPostExecute()
或Handler.post()
。
答案 1 :(得分:3)
我很好奇为什么它不提供异步发布
你需要向Otto的作者询问这个问题。其他任何人都只能提供意见,这对于StackOverflow来说是偏离主题的。
是否意味着总线事件的接收者应该通过使用其他异步任务或线程来考虑性能问题,以防止阻塞所有内容?
取决于:
您发布事件的线程是什么(例如,如果是从后台线程发布的,则问题可能会更少)
应对该事件应该做些什么工作
这与Android中的任何其他内容没有显着差异:作为开发人员,您需要知道将要调用的线程以及您计划在该线程上花费的时间,以便了解您是否需要做一些事情让这项工作变得异步或不同步。
IOW,Otto解决了事件路由的问题,但线程仍然取决于你。这是greenrobot的EventBus提供更多选择的一个领域。