Java 如何在Android中处理MVVM中的回调和状态

Java 如何在Android中处理MVVM中的回调和状态,java,android,mvvm,architecture,kotlin,Java,Android,Mvvm,Architecture,Kotlin,我有两个问题: 如何处理事件,如用户登录等。 假设我有一个存储库,在我的viewModel中调用Repo.function,当用户按下按钮时,在我的活动中调用viewModel.method。因此,在一段时间内,我的Repo.method完成并返回200,并表示我的用户已登录。问题是,我的android视图(活动/片段)现在应该如何导航?目前我使用EventBus发布和订阅此类事件 如何处理网络加载状态:默认/加载/完成 目前,我有一个单独的单例,它为加载程序提供了ObservableField

我有两个问题:

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

  • 如何处理网络加载状态:默认/加载/完成 目前,我有一个单独的单例,它为加载程序提供了ObservableFields,比如val isTokenLoading=ObservableField(false) 在我的viewModel中,我持有对singleton.isTokenLoading的引用 我的视图绑定到该viewModel的字段 通过这种方式,我可以在加载过程中处理UI更改


  • 做这些事情的最佳方式是什么?

    对于你的第一个问题,我想说的是,观察者模式是一种方式(也是人们通常选择的方式)。例如,RxJava非常适合您的用例,现在您甚至可以将其用于LiveData。您可以在ViewModel上启动请求,从响应中创建一个Observable,执行所有需要的操作,并执行以下操作之一:订阅视图上的最终Observable,或订阅视图上的LiveData,同时通过ViewModel上的Observable订阅对其进行更新(我更喜欢后者,因为它不让RxJava依赖项进入视图)

    至于第二个问题,您已经在使用Observer模式(这也是大多数人的做法),但在我看来,将所有加载字段保持在同一个类中就像是一种代码味道。最好将它们存储在必须处理它们的类中


    编辑:我刚刚看到一篇关于AndroidPub的文章,文章探讨了您想要的内容:

    您应该使用observer模式。您的存储库可以返回一个流(在kotlin coroutine包中)您可以在viewmodel中观察此流。然后您可以将此流公开给实时数据,并在片段或活动中观察此实时数据。使用实时数据将帮助您避免内存泄漏。
    对于处理网络状态,您可以使用另一个实时数据,并将网络状态发布到该状态。如果您愿意,当然可以在视图中观察它。

    我阅读了这篇文章,并在文章中发表了评论。通过这种方法,ViewModel了解有关视图的所有信息。它们之间不再存在松散耦合。我真的想知道正确的方法是什么。@Olkunmustafa ViewModel是如何知道视图的?它对视图没有任何依赖性:p。不过,现在我一直在采用单向数据流方法,而且效果很好。