Android ViewModel的职责是仅保留数据或保留数据+;视图控制器?

Android ViewModel的职责是仅保留数据或保留数据+;视图控制器?,android,android-architecture-components,android-viewmodel,android-mvp,Android,Android Architecture Components,Android Viewmodel,Android Mvp,据我们所知 ViewModel类旨在以生命周期意识的方式存储和管理与UI相关的数据 但我认为很多开发人员使用ViewModel作为数据存储和控制器(比如调用存储库、网络客户端获取数据)。我还将as用于数据存储和控制器以供查看 Android官方示例代码也有一些控制器逻辑。发件人: 类MyViewModel:ViewModel(){ 私有val用户:惰性的MutableLiveData{ MutableLiveData()。同样{ loadUsers() } } fun getUsers():Li

据我们所知

ViewModel类旨在以生命周期意识的方式存储和管理与UI相关的数据

但我认为很多开发人员使用
ViewModel
作为数据存储和控制器(比如调用存储库、网络客户端获取数据)。我还将as用于数据存储和控制器以供查看

Android官方示例代码也有一些控制器逻辑。发件人:

类MyViewModel:ViewModel(){
私有val用户:惰性的MutableLiveData{
MutableLiveData()。同样{
loadUsers()
}
}
fun getUsers():LiveData{
返回用户
}
私人娱乐用户(){
//执行异步操作以获取用户。
}
}
在这里,
loadUsers
可能会调用一些存储库网络客户端。在这里,它就像控制器

我相信很多开发人员都是这样做的,但是从定义上看,
ViewModel
应该存储和管理与UI相关的数据,而
ViewModel
应该充当控制器吗

我发现了一些stackoverflow线程和关于此的信息

第一个被接受的答案建议不要将
ViewModel
用作控制器,而将控制器用于其他任务

在第二个one的评论部分@commonware还建议不要使用数据以外的复杂事物

所以我的问题是

  • 从建筑概念来看,
    ViewModel
    的实际责任是什么
  • 如果我必须做一些与视图相关的方法调用[如数据查询、网络调用和其他与业务登录相关的东西],我应该在哪里做
  • 如果我必须使用控制器,那么我如何连接
    视图
    控制器,以便在片段之间进行设备旋转和共享控制器
  • 希望我的问题大家都清楚

    提前谢谢

    这里
    loadUsers()
    可能会调用某个存储库或网络客户端。在这里,它就像控制器

    我相信很多开发人员都是这样做的,但从定义上看,ViewModel应该存储和管理与UI相关的数据,ViewModel应该充当控制器吗

    理论上,数据检索应该是
    LiveData
    内部的,由
    活动观察者触发,并基于此决定要做什么(在
    onActive()
    )。如果LiveData实际上是一个
    MediatorLiveData
    ,那么这也适用于与
    addSource
    绑定的任何块,因为只有当活动观察者观察到MediatorLiveData时,才调用添加了
    addSource
    MediatorLiveData
    的块

    您可以在中看到这项技术得到了最充分的应用。ViewModel只存储数据,不知道数据加载

    从建筑概念来看,ViewModel的实际职责是什么

    如果您看到Yigit Boyar(查看模型的创建者)的评论:

    我是添加它的人(或团队的一部分),它与MVVM无关。这一切都是为了给人们一个应该把数据放在哪里的课程

    AAC不是MVVM实现,VM概念也不是MVVM的一部分

    其实,主要的动机是,;我们一直在告诉开发人员不要在UI控制器中管理数据,答案也是,那么在哪里呢?而ViewModel就是答案

    我们希望它成为您的视图层(片段、活动等)的模型。事后看来,最好选择一个新名字,但命名确实很难

    总之:ViewModel是MVC场景中的模型,其中
    C
    是活动或片段,
    V
    是膨胀视图,
    M
    ViewModel

    如果我必须做一些与视图相关的方法调用[如数据查询、网络调用和其他与业务登录相关的东西],我应该在哪里做

    ViewModel以LiveData的形式获取数据,LiveData通过在给定生命周期的视图中观察而“激活”

    网络调用也应该以相同的方式触发(如果按照LiveData设计的方法进行)

    理论上,如果您有一个登录调用,那么您也可以在控制器中而不是在模型中进行,这样您就可以在片段中进行,即使有一些技巧,比如Jetpack数据绑定,可以让您直接从XML从模型的视图中调用方法

    若我必须使用控制器,那个么我如何连接视图和控制器以进行设备旋转,并在片段之间共享控制器


    ViewModel公开
    LiveData
    ,并且可能也会公开,但两者都不是命令绑定),如果需要,视图或控制器都可以直接对其调用方法。ViewModel跨配置更改(而不是跨进程死亡,ofc)存储,因此它不应包含直接视图引用。

    谢谢您的回答。如果我使用
    Controller
    ,那么我如何在
    片段之间共享
    Controller
    的相同实例?就像我现在用
    ViewModel
    在片段之间共享同一个VM实例一样。制作
    Controller
    Singletone?如果数据检索应该是
    LiveData
    内部的,那么对于每个
    LiveData
    我必须在
    LiveData
    中插入
    存储库
    DataSource
    ,对吗?控制器就是片段。“模型”是视图模型。您可以通过使用共享超级作用域(Activity、NavBackbackEntry或具有ViewModelStore的自定义对象)在片段之间共享ViewModel,您不能在片段之间共享片段(从技术上讲,您可以使用
    findFragmentByTag
    ,但这很棘手)。调用存储库方法而不实际调用LiveData
    class MyViewModel : ViewModel() {
      private val users: MutableLiveData<List<User>> by lazy {
         MutableLiveData().also {
            loadUsers()
         }
      }
    
      fun getUsers(): LiveData<List<User>> {
        return users
      }
    
      private fun loadUsers() {
        // Do an asynchronous operation to fetch users.
      }
    }