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无论如何都更好: