使用像Otto或EventBus这样的事件库是处理活动、片段和后台线程之间关系的推荐方式吗?

47
在大多数情况下,处理情况时:
  • 使用用户线程 (AsyncTask) 执行后台处理
  • 将计算结果传递回 ActivityFragment
  • ActivityFragment 可能在用户线程完成后台处理之前重新创建
目前,从许多可靠来源得知,建议的方法是使用保留片段 (Retained Fragment)

参考资料

不时地,我听说事件总线库很适合处理Activities、Fragments和后台线程之间的关系。(请参考https://github.com/greenrobot/EventBus。它指出可以与Activities、Fragments和后台线程配合良好
我发现了一些非常流行的事件总线库: 我想知道,在处理Activities、Fragments和后台线程之间的关系方面,事件总线方式与保留片段方式有什么不同?
哪种方式是推荐的?
4个回答

18
事件总线和Otto并不是Android开发者指南中“推荐的方式”,主要是因为它们是第三方库,用于简化任务。我认为Otto相对较新,所以旧的指南显然没有使用它。
个人而言,我喜欢Otto,这也是我使用的,到目前为止我没有遇到任何问题。但当然,那是因为它适合我的用例。
我有一个关于我如何使用Otto的例子在这里
未来的编辑:如果你需要一个事件总线,greenrobot/EventBus比Otto更好。此外,在某些情况下,LiveData完全足够,而无需使用事件总线(它不像事件总线一样向任何人发出事件,只向订阅者发出)。

1
@Yar 我知道你的感受,这就是为什么我在这里有一个“发布到主线程”的事件队列:https://dev59.com/dYfca4cB1Zd3GeqPns75#28480952(注意:这在进程死亡时不会以任何方式保留!) - EpicPandaForce
所以我理解得没错:通常Otto确实会向暂停的片段发送事件... - Yar
除非您阻止它,否则是的。有些人在onResume和onPause中注册/注销,但事件将会丢失。这就是为什么我个人只允许在“暂停”为“false”的情况下发送事件。 - EpicPandaForce
4
我认为EventBusOtto更好,因为我用过两者。 - EpicPandaForce
1
@naxa 我在谈论的是这个Otto,虽然它已经被Rx所取代,而且EventBus3更好:https://github.com/square/otto - EpicPandaForce
显示剩余3条评论

3
我想知道,当涉及处理活动、片段和后台线程之间的关系时,事件总线方法与保留的片段方法有何不同?哪种方法是推荐的?
我觉得你误解了两个概念:
1)防止在旋转设备时重复创建任务
2)从线程发送消息到活动或从服务发送消息到片段等
当我们把一个任务放在片段中时,我们只是不希望在旋转时再次启动它。此外,我们希望从它那里得到结果,例如,我们想要更新一个imageView,但如果将imageView传递给asynctask,然后旋转设备,如果将imageView存储为弱引用,则在活动销毁后imageView为空,如果将其存储为强引用,则会泄漏活动。因此更好的想法是将其放在片段中,并将视图存储为弱引用,如果调用activity onCreate时更新该引用。
EventBus和Otto是非常好的库,可以在任何组件或线程之间发送消息。你可以使用这些库,也可以使用Android本地解决方案,如创建接口、localBroadcastManager或handler。
关于"事件总线方法与保留的片段方法有何不同",我没有查看过源代码,但我认为它们创建了一个单例队列对象,并将您的消息存储在其中,然后将其出列以将您的消息传递给它们的侦听器。

通过使用弱引用技术,您可以防止AsyncTask调用无效的UI,但是您的AsyncTask没有与重新创建的UI交互的能力。保留实例片段或事件总线都可以克服这种缺点。 - Cheok Yan Cheng
我宁愿使用带有LruCache的asynctask,这样如果再次调用它,它就可以立即返回结果。 - mmlooloo

0

EventBus 一如既往地最好。

Otto 现已弃用。

otto 的链接中:

这个项目已经被 RxJava 和 RxAndroid 取代。这些项目允许与 Otto 相同的事件驱动编程模型,但它们更加强大并提供更好的线程控制。

如果您正在寻找有关从 Otto 迁移到 Rx 的指导,此文章 是一个不错的开始。


0

在一个简单的ActivityFragment之间进行通信可以通过多种方式轻松建立,但最优雅的方法是创建和使用简单的interface类。但对于像托管显示另一个片段的片段的活动,然后这个子片段需要与父活动或片段通信的场景,这就是EventBus可以利用的地方,因为没有其他方式可以进行通信。只有在没有其他方法将数据发送到另一个类时才应该使用EventBus。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接