繁体   English   中英

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

[英]Android Architecture Components ViewModel - communication with Service/IntentService

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

TL; DR它是可以实现的 - 使用观察者关系。 您的IntentService和可能的位置服务应该知道您的ViewModel。 考虑使用存储库。 可以使用postValue (请参阅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 ,要么使用另一个observable,比如RxFlowable。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM