Jan*_*ski 6 android mvvm android-viewmodel android-architecture-components
我在探索谷歌的Android架构组件.在我的项目中,我依赖于Services和IntentServices.从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).然后...
它基本上是一长串观察者关系.在每个级别,进行适当的处理,然后设置一个observable,用新数据触发下一级.这允许您避免与IntentService/Repository/ViewModel的强耦合.
您的服务不会知道您的ViewModel(或存储库,如果您有),它们应该只设置一个observable的值.如果您想跳过存储库,可以让ViewModel观察您的远程数据源类,但是如果您需要执行任何逻辑,例如将下载的数据保存到数据库,您可能需要一个存储库.
关于的两个注意事项LiveData- 如果您在进行后台操作时需要更新LiveData,请使用postValue.
LiveData具有生命周期意识,这使得它特别适合于使用生命周期(活动/片段)进行观察.该observe方法需要一个LifecycleOwner.
对于存储库/网络代码中的B和A等观察者,可能不会有LifecycleOwner.这意味着要么像使用一样observerForever,要么使用其他可观察对象,比如RxFlowable.
| 归档时间: |
|
| 查看次数: |
3329 次 |
| 最近记录: |