46

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

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

到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 Retained Fragment

来源

有时,我听说事件总线库对于处理活动、片段和后台线程之间的关系很有用。(请参考https://github.com/greenrobot/EventBus。它声明与活动、片段和后台线程一起表现良好

我遇到了一些非常流行的事件总线库

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

哪些方式是推荐的方式?

4

4 回答 4

18

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

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

我有一个关于我如何在这里使用 Otto 的示例。

来自未来的编辑:如果你需要一个事件总线,greenrobot/EventBus比奥托更好。此外,在某些情况下,LiveData<T>完全足够而不是使用事件总线(而不是向任何人发出事件,只向订阅者发出)。

于 2015-03-05T09:56:04.977 回答
3

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

哪些方式是推荐的方式?

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

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

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

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

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

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

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

于 2015-03-08T07:04:26.883 回答
0

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

于 2019-10-02T15:41:14.847 回答
0

EventBus 一如既往的好。

Otto现在已被弃用。

otto的这个链接:

该项目已弃用,取而代之的是 RxJava 和 RxAndroid。这些项目允许使用与 Otto 相同的事件驱动编程模型,但它们更强大,并且提供更好的线程控制。

如果您正在寻找从 Otto 迁移到 Rx 的指导,这篇文章 是一个好的开始。

于 2020-01-21T12:11:53.750 回答