LocalBroadcastManager已被弃用,我应该使用什么来替代它?

22
我正在开发一个Android项目,其中需要使用具有前台服务的CountdownTimer。在Stack Overflow上,一些其他答案提到LocalBroadcastManager适合我的需求。
然而,Android Developers文档中提到它已经被弃用。你有什么替代建议吗?文档提到可以使用LiveData,但我想知道是否有更简单的解决方案。
1个回答

15

LocalBroadcastManager 基本上是一个带有许多不必要的 Intent 和 intent 过滤器仪式的 事件总线。 因此,一种替代方法很容易,并且功能类似:您可以使用任何事件总线库。 greenrobot 的 EventBus 是一个受欢迎的选择(这里有一个指南),如果您已经在使用 Guava,则它也有一个 Guava(但是仅为了事件总线而包括 Guava 太重了)。

但事件总线遇到了与LocalBroadcastManager相同的问题,导致其被弃用:它是全局的,不具有生命周期感知能力,并且随着您的应用程序变得越来越大,很难推断更改事件的影响。对于观察数据的情况,LiveData解决了这个问题,因为它具有生命周期感知能力,所以您不会在错误的时间(如在View设置之前或afteronSaveInstanceState)收到更改通知,但它会在您再次处于正确状态时处理提供更改通知的操作。它还更加紧密地作用域 - 每个LiveData都是单独访问的,而不是整个应用程序通常只有一个事件总线/LocalBroadcastManager。

对于更多的事件而不是数据变化的情况,您有时可以将其转换为数据。例如,考虑“登录”和“注销”事件- 您可以创建一个存储已登录用户帐户的LiveData,当用户注销时,将其置为空值。然后组件可以观察该LiveData。

确实存在一些情况,很难将其转换为可观察的数据(虽然我无法立即想出任何通常与事件总线模式一起使用的示例)。对于这些情况,请考虑编写自己的监听器接口,类似于on-click监听器的工作方式。

对于您提到的倒计时器示例,我认为LiveData是一个非常简单直接的解决方案,比事件总线甚至LocalBroadcastManager都要容易得多。您只需拥有一个当前值的LiveData,然后从需要显示该值的任何位置订阅它即可。


6
LiveData 的问题在于它取代了 EventBus Sticky Events,但对于非粘性事件来说并不好。 - EpicPandaForce
1
@EpicPandaForce 对啊,同意。我在回答中试图提及这一点,这也是我包括另一个事件总线、实时数据或自定义监听器接口选项的部分原因。 - Ryan M
7
如果在服务更改状态/传输信息时使用 LiveData,那么您会将这个 LiveData 放在全局单例中吗?或者服务和应用程序的其他部分(存储库、活动)如何访问它? - xuiqzy
1
作为替代方案,Kotlin Flow是否可用?https://kotlinlang.org/docs/reference/coroutines/flow.html#asynchronous-flow - xuiqzy

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