我在探索Google的Android Architecture Components。在我的项目中,我依靠Services和IntentServices。从IntentService或服务与app的ViewModel进行通信的正确方法是什么?是否可以使用LiveData实现?
答案 0 :(得分:19)
TL; DR它可以实现 - 使用观察者关系。您的IntentService和可能的位置服务应不了解您的ViewModel。考虑使用存储库。可以使用LiveData(参见postValue
)。它有助于更新UI(ViewModel到Activity通信),因为它具有生命周期感知功能。如果您没有更新用户界面,可以考虑使用RxJava。
这取决于您遵循的架构。如果您正在执行与Guide to App Architecture中描述的内容类似的操作,您的IntentService可能是由您的远程数据源代码启动的:
您的远程数据源代码将具有可观察的(Rx Flowable,LiveData等),我将调用可观察的A,用于意图服务下载的数据。您的Repository类(如果您使用的话)将具有可观察的b,并且您的ViewModel将具有可观察的c。
Repository订阅你的网络代码中的observable(可观察的A),ViewModel订阅你的Repository中的observable(可观察的B),你的Activity / Fragment / View订阅了你的ViewModel中的observable(可观察的c) 。然后...
它基本上是一长串的观察者关系。在每个级别,进行适当的处理,然后设置一个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。