Android 使用Otto或EventBus之类的事件库是处理活动、片段和后台线程之间关系的推荐方法吗

Android 使用Otto或EventBus之类的事件库是处理活动、片段和后台线程之间关系的推荐方法吗,android,android-asynctask,event-bus,otto,greenrobot-eventbus,Android,Android Asynctask,Event Bus,Otto,Greenrobot Eventbus,在大多数情况下,在处理案件时 执行后台处理的用户线程(AsyncTask) 将计算结果传回活动或片段 活动或片段可能在用户线程完成其后台处理之前重新创建 到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段 来源 我经常听说事件总线库非常适合处理活动、片段和后台线程之间的关系。(请参阅。它说明如何在活动、片段和后台线程中运行良好) 我遇到了一些非常流行的事件总线库 我想知道,在处理活动、片段和后台线程之间的关系时,事件总线方法与保留片段方法有何不同 哪些方式是

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

  • 执行后台处理的用户线程(
    AsyncTask
  • 将计算结果传回
    活动
    片段
  • 活动
    片段
    可能在用户线程完成其后台处理之前重新创建
到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段

来源
我经常听说事件总线库非常适合处理活动、片段和后台线程之间的关系。(请参阅。它说明如何在活动、片段和后台线程中运行良好)

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

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


哪些方式是推荐方式?

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

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

我有一个关于如何使用奥托的例子

从未来编辑:如果需要事件总线,它比Otto更好。此外,在某些情况下,它完全可以代替使用事件总线(它不向任何人发送事件,只向订阅者发送事件)

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

哪种方式是推荐的方式

我想你误解了两个概念:

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

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

当我们把一个任务放在一个片段中时,如果我们在旋转,我们就不想再次启动它。此外,我们还希望从中获取结果。例如,我们希望更新imageView,但如果将imageView传递给异步任务,然后旋转设备,如果将imageView存储为弱引用,则活动销毁后imageView为空,如果将其存储为强引用,则泄漏活动。因此,更好的方法是将其放在片段中,并将视图存储为弱引用,如果调用activity onCreate来更新该引用

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

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


我没有研究过这些的源代码,但我认为他们创建了一个singleton queue对象,并将您的消息存储在其中,然后将其出列以将您的消息传递给他们的侦听器。

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

始终是最好的选择

现在不推荐使用

从以下链接:

这个项目不推荐使用RxJava和RxAndroid。这些 项目允许使用与Otto相同的事件驱动编程模型,但是 它们的功能更强,并提供更好的线程控制

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


通过使用弱引用技术,可以防止AsyncTask调用无效的UI,但AsyncTask无法与重新创建的UI交互。保留的实例片段或事件总线都可以克服这一缺点。我更愿意将asynctask与LruCache一起使用,因此如果您再次调用它,它将立即传递结果。事件是否仅在片段/活动运行时接收?我的意思是在onResume()之后和onPause()之前?我的片段在onPause()之后收到一条消息,这似乎是不好的@是的,我知道这种感觉,这就是为什么我在这里有一个“发布到主线程”的事件队列(注意:这在进程死亡时不会以任何方式保留!),所以我正确地理解了它:一般来说,Otto确实会将事件发送到暂停的片段……我认为
EventBus
实际上比
Otto
更好,现在我已经使用了这两种方法。@naxa我正在谈论这个Otto,尽管它已经被反对使用Rx,而且EventBus3无论如何都更好: