![](/img/trans.png)
[英]Android Architecture Components - communication between Activity/Fragment and Service/IntentService
[英]Android Architecture Components ViewModel - communication with Service/IntentService
我在探索谷歌的Android架构组件 。 在我的项目中,我依赖于Services和IntentServices 。 从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)。 然后...
它基本上是一长串观察者关系。 在每个级别,进行适当的处理,然后设置一个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.