不推荐使用LocalBroadcastManager。我应该用它代替什么?

时间:2020-04-28 16:20:19

标签: android service android-livedata localbroadcastmanager

我正在Android上的该项目中进行工作,其中一个方面需要具有前台服务的CountdownTimer。关于Stack Overflow的其他一些答案提到LocalBroadcastManager将适合我的需求。

但是,Android Developers中的文档提到它已被弃用。关于我应该使用它的任何建议?该文档提到了有关使用LiveData的信息,但是我想知道是否还有任何更简单的选择。

2 个答案:

答案 0 :(得分:4)

LocalBroadcastManager基本上是event bus,其中有很多不必要的围绕Intent和Intent过滤器的仪式。因此,一种替换很容易,并且功能非常相似:您可以使用任何事件总线库。 greenrobot's EventBus是最受欢迎的选择(here's a guide for it)和Guava also has one,如果您已经在使用Guava(但Guava非常笨重,只能用于事件总线)。

但是事件总线也遭受与LocalBroadcastManager相同的问题,导致过时它被弃用:它是全球性的,不具有生命周期意识,并且随着您的应用程序变得越来越大,就很难对更改的影响进行推理参加一个活动。对于观察数据的情况,LiveData可以很好地解决此问题,因为它具有生命周期意识,因此您不会在错误的时间(例如,在设置View之前或在onSaveInstanceState之后)收到更改通知。 -但是当您再次处于正确的状态时,它将处理交付更改通知。它的作用域也更紧密-每个LiveData都可以单独访问,而不是(通常)整个应用程序都拥有一个事件总线/ LocalBroadcastManager。

对于更多的是事件而不是要更改的数据的情况,有时可以将其转换为数据。考虑一下您是否具有“登录”和“注销”事件-您可以创建一个LiveData来存储一个用于已登录用户的帐户,并在用户注销时变为null。然后组件可以观察到这一点。

在某些情况下,确实很难将其转换为可观察的数据(尽管我无法立即想到通常会与事件总线模式一起使用的任何示例)。对于这些,请考虑编写自己的侦听器界面,类似于单击式侦听器的工作原理。

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

答案 1 :(得分:0)

除了“Ryan M”答案之外,从“Fragment”库 v1.3.0-alph04 开始,Androidx 引入了新的“Fragment result Api”,可用于 Fragment 或 Activity-Fragment 之间的通信。您将带有键的数据/事件传递给 FragmentManager,而有权访问该 FragmentManager 的片段/活动可以通过指定正确的键来侦听数据。

它可能比 LiveData 更适合“事件”,但是我在使用它时遇到的一个问题是您必须知道源、目标和 FragmentManager 之间的关系。例如,假设我们正在使用来自 Jetpack 的导航组件,并且有一个想要与宿主 Activity 通信的简单片段。您可能认为 Activity 的 supportFragmentManager 和 Fragment fragmentManager 是同一个实例,但实际上主题之间有一个 NavHostFragment,它们有一个 fragmentManager 来承载目标 Activity。