使用像Otto或EventBus这样的事件库是一种处理活动,片段和后台线程之间关系的推荐方法

时间:2015-03-05 09:51:11

标签: android android-asynctask event-bus otto greenrobot-eventbus

在大多数情况下,处理案例时

  • 执行后台处理的用户线程(AsyncTask
  • 将计算结果传回ActivityFragment
  • 在用户线程完成后台处理之前,可能会发生
  • ActivityFragment重新创建

到目前为止,从许多可靠的来源,我可以看到推荐的方式正在使用 保留片段

来源

我不时会听到事件总线库可以处理活动,片段和后台线程之间的关系。 (请参阅https://github.com/greenrobot/EventBus。它声明在活动,片段和后台线程中表现良好

我遇到了一些非常受欢迎的活动总线库

我想知道,当处理活动,片段和后台线程之间的关系时,事件总线方法与保留片段方法有什么不同?

推荐哪种方式?

4 个答案:

答案 0 :(得分:16)

事件总线和Otto不是Android开发人员指南的“推荐方式”,主要是因为他们是第三方库来简化任务。我相信Otto相当新,所以年长的导游显然没有使用它。

我个人喜欢Otto,这是我使用的,到目前为止我没有遇到任何问题。但当然,那是因为它适合我的用例。

我有一个关于我如何使用Otto here的例子。

来自未来的编辑:如果您需要事件总线,greenrobot/EventBus优于Otto。此外,在某些情况下,LiveData<T>完全足够,而不是使用事件总线(而不是向任何人发送事件,只发送给订阅者)。

答案 1 :(得分:3)

  

我想知道,什么时候处理活动之间的关系,   片段和后台线程,事件总线方法如何不同   从保留片段方法?

     

推荐哪种方式?

我认为你误解了两个概念:

1)在您旋转设备时阻止任务一次又一次地创建

2)将消息从线程发送到活动或从服务发送到片段或......

当我们将一个任务放入一个片段时,如果我们正在旋转,我们就不希望再次开始它。此外,我们希望从中获取结果,例如我们要更新imageView,但是如果将imageView传递给asynctask,然后如果将imageView存储为弱引用则旋转设备,那么在活动之后,imageView为null销毁,如果您将其存储为强引用,则泄漏活动。所以更好的想法是将它放在一个片段中,并将视图存储为弱引用,如果调用onCreate活动,则更新该引用。

EventBus和Otto是在任何组件或线程之间发送消息的非常好的库。您可以使用那些或Android本机解决方案,如创建接口或localBroadcastManager或处理程序。

  

事件总线方法与保留片段方法有何不同?

我没有查看过这些代码的源代码,但我认为他们创建了一个单例队列对象并将消息存储在其中并将其出列以将消息传递给他们的侦听器。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

EventBus一如既往。

Otto现在已弃用。

通过otto的链接:

不推荐使用此项目,而推荐使用RxJava和RxAndroid。这些 项目允许使用与Otto相同的事件驱动编程模型,但是 它们更强大,并且可以更好地控制线程。

如果您正在寻找从Otto迁移到Rx的指南,请this post 是一个好的开始。

相关问题