Android架构组件ViewModel - 与Service/IntentService的通信

Jan*_*ski 6 android mvvm android-viewmodel android-architecture-components

我在探索谷歌的Android架构组件.在我的项目中,我依赖于ServicesIntentServices.从IntentService或Service 与app的ViewModel通信的正确方法是什么?使用LiveData可以实现吗?

Lyl*_*yla 23

TL; DR它是可以实现的 - 使用观察者关系.您的IntentService和可能的位置服务应该知道您的ViewModel.考虑使用存储库.可以使用LiveData(请参阅参考资料postValue).这对于更新UI(ViewModel到Activity通信)很有用,因为它具有生命周期感知功能.当您不更新UI时,您可以考虑使用RxJava.


这取决于你所遵循的架构.如果您正在执行类似于"应用程序架构指南"中所述的操作,则您的IntentService可能是由远程数据源代码启动的:

在此输入图像描述

您的远程数据源代码将具有可观察的(Rx Flowable,LiveData等),我将其称为可观察的A,用于意图服务下载的数据.您的Repository类(如果您使用的话)将具有可观察的b,并且您的ViewModel将具有可观察的c.

Repository订阅您的网络代码中的observable(可观察的A),ViewModel订阅您的Repository中的observable(可观察的B),并且您的Activity/Fragment/View订阅了ViewModel中的observable(可观察的c).然后...

  1. IntentService获取数据并设置可观察的A.
  2. 这会触发您的存储库,因为它已订阅 - 它执行存储库应该执行的数据处理类型,例如将数据保存到数据库.
  3. 存储库完成后,它会使用新处理的数据设置可观察的B.
  4. 这会触发你的ViewModel,因为它是订阅的 - 它执行ViewModel所做的数据处理,即格式化数据以便为视图做好准备,然后设置可观察的C ......
  5. 这会触发更新UI的Activity/Fragment/View

它基本上是一长串观察者关系.在每个级别,进行适当的处​​理,然后设置一个observable,用新数据触发下一级.这允许您避免与IntentService/Repository/ViewModel的强耦合.

您的服务不会知道您的ViewModel(或存储库,如果您有),它们应该只设置一个observable的值.如果您想跳过存储库,可以让ViewModel观察您的远程数据源类,但是如果您需要执行任何逻辑,例如将下载的数据保存到数据库,您可能需要一个存储库.

关于的两个注意事项LiveData- 如果您在进行后台操作时需要更新LiveData,请使用postValue.

LiveData具有生命周期意识,这使得它特别适合于使用生命周期(活动/片段)进行观察.该observe方法需要一个LifecycleOwner.

对于存储库/网络代码中的B和A等观察者,可能不会有LifecycleOwner.这意味着要么像使用一样observerForever,要么使用其他可观察对象,比如RxFlowable.