Android 如果我们可以直接从MVVM中的片段访问存储库,为什么要使用ViewModel

Android 如果我们可以直接从MVVM中的片段访问存储库,为什么要使用ViewModel,android,mvvm,android-recyclerview,Android,Mvvm,Android Recyclerview,我是一个初学者,我想知道为什么我们在MVVM中使用ViewModel,因为我们可以直接访问存储库并从Fragment调用存储库函数。这种方法似乎更容易。 请看下面的细节,我为什么问这个问题 如果您想查看代码,请参阅Stackoverflow中的以下问题: 我有一个问题,我想在RecyclerView中显示所选id的详细信息,但当我使用ViewModel时,RecyclerView总是显示所有id的详细信息。 然后,我不再通过ViewModel访问存储库,而是直接访问存储库并解决了这个问题。现在

我是一个初学者,我想知道为什么我们在MVVM中使用ViewModel,因为我们可以直接访问存储库并从Fragment调用存储库函数。这种方法似乎更容易。 请看下面的细节,我为什么问这个问题

如果您想查看代码,请参阅Stackoverflow中的以下问题:

我有一个问题,我想在RecyclerView中显示所选id的详细信息,但当我使用ViewModel时,RecyclerView总是显示所有id的详细信息。
然后,我不再通过ViewModel访问存储库,而是直接访问存储库并解决了这个问题。现在,RecyclerView仅显示所选id的详细信息。

您必须将业务逻辑与UI逻辑分开,并且在使用视图模型和存储库进行数据连接时,您可以更好地处理异常

你应用了错误的逻辑。 要解决上述问题,请将活动中的数据发送到视图模型,并将视图模型发送到存储库,然后将数据从视图模型发送到该特定id的活动。这将对您有所帮助

活跃

viewmodel1.ProfileFetch(id)
然后在ViewModel中

 fun ProfileFetch(id:String?) {
        Coroutines.main {
            try {
                val response = repository.StudentProfile(id)
                response?.let {
                    if(response.statusResponse!!.statusCode.equals("1")){
                        Log.v("sssss","ppppppp")
                        studentProfileResponseListner?.onSuccess(response)
                    }else{
                        studentProfileResponseListner?.onFailure(response!!.statusResponse?.message)
                    }
                }

            } catch (e: ApiException) {
                studentProfileResponseListner?.onFailure(e.message!!)
            } catch (e: NoInternetException) {
                studentProfileResponseListner?.onFailure(e.message!!)

            } catch (e: SocketTimeoutException) {
                studentProfileResponseListner?.onFailure("Network is unreachable")

            } catch (e: Exception) {
                studentProfileResponseListner?.onFailure("Sorry for inconvenience, system has encountered technical glitch")

            }
        }
    }
将id从ViewModel传递到存储库

  val response = repository.StudentProfile(id)

ViewModel
类旨在以生命周期意识的方式存储和管理与UI相关的数据。ViewModel类允许数据在配置更改(如屏幕旋转)后继续存在

Android框架管理UI控制器的生命周期,如活动和片段。框架可能会决定销毁或重新创建UI控制器,以响应完全超出您控制范围的某些用户操作或设备事件

如果系统销毁或重新创建UI控制器,则存储在其中的任何与UI相关的瞬态数据都将丢失。例如,您的应用程序可能会在其活动之一中包含用户列表。为配置更改重新创建活动时,新活动必须重新获取用户列表。对于简单数据,活动可以使用
onSaveInstanceState()
方法并从onCreate()中的捆绑包中恢复其数据,但此方法仅适用于可序列化然后反序列化的少量数据,而不适用于潜在的大量数据,如用户列表或位图

另一个问题是UI控制器经常需要进行异步调用,这可能需要一些时间才能返回。UI控制器需要管理这些调用,并确保系统在销毁这些调用后进行清理,以避免潜在的内存泄漏。这种管理需要大量的维护,在为配置更改而重新创建对象的情况下,这是一种资源浪费,因为对象可能必须重新发出它已经发出的调用

将视图数据所有权与视图数据所有权区分开来更容易、更高效 UI控制器逻辑


有关更多信息和示例检查

从编程的角度来看,您有抽象-视图不应该知道如何与模型交互,在本例中是存储库-这是视图模型的责任。这导致了关注点的分离,视图模型处理与模型的交互,将它们呈现给视图,视图负责向用户表示数据。这就导致了可测试性。如果您可以分离出行为和逻辑的各个层,那么您就可以单独测试逻辑。如果您遵循这些简单的原则,那么维护和添加新功能也会更容易。谢谢您的解释。由于我是新来的,我理解这个概念,但可能需要一些时间才能完全理解。谢谢你的解释。我试试看。谢谢你的帮助。