我正在探索 Google 的Android Architecture Components。在我的项目中,我依赖Services和IntentServices。从 IntentService 或 Service与应用的ViewModel通信的正确方法是什么?使用 LiveData 可以实现吗?
1 回答
TL;DR 这是可以实现的——使用观察者关系。您的 IntentService 和可能的位置服务不应该知道您的 ViewModel。考虑使用存储库。可以使用 LiveData(请参阅 参考资料postValue
)。它有利于更新 UI(ViewModel 到 Activity 通信),因为它具有生命周期感知能力。当你不更新 UI 时,你可以考虑 RxJava。
这取决于您遵循的架构。如果您正在执行与应用架构指南中所述类似的操作,则您的 IntentService 可能是由您的远程数据源代码启动的:
您的远程数据源代码将有一个 observable(Rx Flowable、LiveData 等),我将其称为 observable A,用于您的意图服务下载的数据。您的 Repository 类(如果您使用一个)将有一个可观察的 b,而您的 ViewModel 将有一个可观察的 c。
Repository 订阅你的网络代码中的 observable(observable A),ViewModel 订阅你的 Repository 中的 observable(observable B),你的 Activity/Fragment/View 订阅你的 ViewModel 中的 observable(observable c)。然后...
- IntentService 取回数据并设置 observable A
- 这会触发您的存储库,因为它已订阅 - 它执行存储库应该执行的数据处理类型,例如将数据保存到数据库。
- 当您的存储库完成后,它会使用新处理的数据设置 observable B。
- 这会触发您的 ViewModel,因为它已订阅 - 它执行 ViewModel 所做的数据处理类型,即格式化数据以便为视图做好准备,然后设置可观察的 C ...
- 这会触发更新 UI 的 Activity/Fragment/View
它基本上是一长串的观察者关系。在每个级别,都会进行适当的处理,然后设置一个可观察对象,该对象会使用新数据触发下一个级别。这使您可以避免与 IntentService/Repository/ViewModel 的强耦合。
您的服务不会知道您的 ViewModel(或存储库,如果有的话),它们应该简单地设置可观察的值。如果您想跳过存储库,可以让 ViewModel 观察您的远程数据源类,但如果您需要执行任何逻辑,例如将下载的数据保存到数据库中,您可能需要一个存储库。
关于LiveData
- 如果您需要在执行后台操作时更新 LiveData,请使用postValue
.
LiveData 具有生命周期感知能力,这使得它特别适合通过具有生命周期的事物(活动/片段)进行观察。该observe
方法采用LifecycleOwner
.
对于存储库/网络代码中的 B 和 A 之类的观察者,可能不会有 LifecycleOwner。这意味着要么做类似 using 的事情observerForever
,要么使用另一个 observable,比如 RxFlowable。