LocalBroadcastManager 已被弃用。我应该用什么代替它?

Arp*_*car 17 service android localbroadcastmanager android-livedata

我正在 Android 中处理这个项目,其中一个方面需要一个带有前台服务的 CountdownTimer。Stack Overflow 上的其他一些答案提到 LocalBroadcastManager 适合我的需求。

然而,Android Developers 中的文档提到它已被弃用。关于我应该在它的位置使用什么的任何建议?文档提到了使用 LiveData,但我想知道是否有更简单的替代方法。

Rya*_*ley 7

LocalBroadcastManager基本上是一个事件总线,在意图和意图过滤器周围有很多不必要的仪式。所以一个替换很容易,而且功能非常相似:您可以使用任何事件总线库。 greenrobot 的 EventBus是一种流行的选择(这里是它的指南)并且Guava 也有一个,如果您已经在使用 Guava(但是 Guava 非常繁重,仅用于事件总线)。

但是事件总线遇到与 LocalBroadcastManager 相同的问题,导致它被弃用:它是全局的,它不是生命周期感知的,并且随着你的应用程序变大,它变得更加难以推理对事件的更改的影响. 对于观察数据的情况,LiveData可以很好地解决这个问题,因为它具有生命周期感知能力,因此您不会在错误的时间收到更改通知(例如在设置 View 之前或之后onSaveInstanceState)-但它会处理传递更改通知当你再次处于正确的状态时。它的范围也更加严格——LiveData 的每一个片段都是单独访问的,而不是(通常)为整个应用程序使用一个事件总线/LocalBroadcastManager。

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

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

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

  • @RyanM 如果在服务更改状态/传输信息的情况下使用“LiveData”,您是否会将这个“LiveData”放在全局单例中,或者服务和应用程序的其他部分(存储库、活动)如何访问它? (7认同)
  • `LiveData` 的问题在于它取代了 `EventBus Sticky Events`,但对于非粘性事件却不好。 (2认同)