如何在mvvm Android中处理回调和状态

时间:2018-07-23 07:40:05

标签: java android mvvm architecture kotlin

我有两个问题:

  1. 如何处理事件,例如用户登录等。 假设我有存储库,并且正在我的viewModel中调用Repo.function,并且当用户按下按钮时,会在我的活动中调用ViewModel.method。因此,在一段时间后,我的Repo.method完成并返回200,并说我的用户已登录。问题是,现在我的android视图(activity / fragment)应该如何导航?目前,我使用EventBus发布和订阅此类事件。

  2. 如何处理网络加载状态:默认/加载/已完成 目前,我有一个单独的单例,该单例具有可用于加载程序的ObservableFields,如val isTokenLoading = ObservableField(false) 在我的viewModel中,我持有对那个singleton.isTokenLoading的引用。 我的视图绑定到该viewModel的字段 这样,我就可以在加载过程中处理UI更改

做这种事情的最好方法是什么?

2 个答案:

答案 0 :(得分:1)

对于您的第一个问题,我想说的是观察者模式是前进的道路(这是人们通常选择的)。例如,RxJava非常适合您的用例,现在您甚至可以将其与LiveData一起使用。您将在ViewModel上启动请求,从响应中创建一个Observable,执行所需的所有操作,然后执行以下操作之一:在更新时订阅视图上的最终Observable或在视图上订阅LiveData通过ViewModel上的可观察订阅来实现它(我更喜欢后者,因为它使RxJava依赖项脱离了视图)。您在线上有大量示例,其中包含实现细节。

关于第二个问题,您已经在使用Observer模式(这也是大多数人使用的方式),但是在我看来,将所有加载字段都保留在同一类中似乎有点代码臭味。将它们存储在必须处理它们的类上可能会更好。

编辑:我刚在AndroidPub上看到一篇文章,探讨了您想要的内容:https://android.jlelse.eu/android-architecture-communication-between-viewmodel-and-view-ce14805d72bf

答案 1 :(得分:0)

您应该使用观察者模式。您的存储库可以返回一个流程(使用kotlin coroutine包),您可以在viewmodel中观察到该流程。那么您可以将此流暴露给实时数据,并在片段或活动中观察此实时数据。使用实时数据将帮助您避免内存泄漏。 为了处理网络状态,您可以拥有另一个实时数据并向其发布网络状态。当然,如果需要,也可以观察它。