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

时间:2017-10-11 07:35:52

标签: android mvvm android-architecture-components android-viewmodel

我在探索Google的Android Architecture Components。在我的项目中,我依靠ServicesIntentServices。从IntentService或服务与app的ViewModel进行通信的正确方法是什么?是否可以使用LiveData实现?

1 个答案:

答案 0 :(得分:19)

TL; DR它可以实现 - 使用观察者关系。您的IntentService和可能的位置服务应了解您的ViewModel。考虑使用存储库。可以使用LiveData(参见postValue)。它有助于更​​新UI(ViewModel到Activity通信),因为它具有生命周期感知功能。如果您没有更新用户界面,可以考虑使用RxJava。

这取决于您遵循的架构。如果您正在执行与Guide to App Architecture中描述的内容类似的操作,您的IntentService可能是由您的远程数据源代码启动的:

enter image description here

您的远程数据源代码将具有可观察的(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的活动/片段/视图
  6. 它基本上是一长串的观察者关系。在每个级别,进行适当的处​​理,然后设置一个observable,用新数据触发下一级。这允许您避免与IntentService / Repository / ViewModel的强耦合。

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

    关于awk '{print $8}' inputfile.gtf > newfile.tsv 的两个注意事项 - 如果您需要在执行后台操作时更新LiveData,请使用postValue

    LiveData是lifecycle-aware,这使得它特别适合于使用生命周期(活动/片段)进行观察。 observe方法需要LiveData

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