当前位置: 首页 > 知识库问答 >
问题:

带有Android架构组件的MVVM

宗乐池
2023-03-14

我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html

我有几个问题...

在上面提到的指南中,Google使用UserRepository类访问这些web服务API-他们继续使该类成为singleton,如果应用程序上只有一个屏幕需要来自REST API的数据,这可能是很好的。

我关心的,是这个;似乎Google提倡在每个ViewModel的基础上创建一个存储库类。这听起来很不对,因为有这么多singlton类在应用程序。如果我们有10个屏幕,有10个ViewModel,每个都需要自己的存储库模块,那么我们的应用程序中就有10个单例。从iOS开发人员的角度来看,有这么多是不对的。

解决这一问题的方法是有一个mediator(存储库)类,它具有公共方法,公开API以从REST API获取数据。Web服务部分将在它自己的类中。这样,我们就有了一个体面的问题分离。

拥有一个存储库类per,ViewModel是最佳实践吗?还是每个应用程序拥有一个存储库类?我对此不是百分之百肯定。

最后,对于room,Google是说我们在每个ViewModel基础上创建一个数据库,还是每个应用只创建一个数据库?

共有1个答案

陈昂熙
2023-03-14

我不认为架构指南建议为每个ViewModel创建单独的存储库类。在所示的示例中,Google使用一个名为Dagger的库将singleton repository类注入到ViewModel中。在功能上拆分存储库(或管理器)通常是最佳实践。例如,UserRepository负责所有与用户相关的api调用。

如果您将此存储库转换为可以注入到任何ViewModel中的单例,那么任何ViewModel现在都可以访问该特定存储库。

在快速查看房间后,我发现了这个小片段(链接):

注意:在实例化AppDatabase对象时,您应该遵循singleton设计模式,因为每个RoomDatabase实例都相当昂贵,而且您很少需要访问多个实例。

对我来说,这意味着您可以以使用存储库类的方式实现RoomDatabase。只需将它们作为一个单例注入ViewModel,这样就不需要拥有同一个数据库的多个实例。

 类似资料:
  • 注意:如果您已经在使用RxJava或Agera这样的库,那么您可以继续使用它们,而不是LiveData。但是当您使用它们或其他方法时,请确保您正确地处理了生命周期,以便在相关的LifecycleOwner停止时数据流暂停,并且在LifecycleOwner被销毁时数据流被销毁。您还可以添加android.arch.lifecycle:reActiveStreams工件,以便将LiveData与另一

  • 我正在使用Kotlin,kapt和Android架构组件。当我构建项目时,一切似乎都很好,但在试图在设备/模拟器上运行应用程序后,Gradle的:Assemble任务抛出以下错误: 警告:警告:注释处理器“Android.arch.persistence.room.RoomProcessor”支持的源版本“release_7”小于-source“1.8” 更新 模块构建。在此处分级 项目生成。gr

  • 我正在浏览Doug Stevenson(Firebase开发者倡导者)的博客,该博客讨论了如何将Firebase实时数据库与android架构组件一起使用。 有一个类,它形成了一个可重用的类来管理所有Firebase查询以及实现LiveData。虽然这完全适用于Firebase RealTime数据库,但我似乎无法更改或更改它以支持云fiRecovery数据库。 这是代码

  • 我知道如何使用ViewModel,Repository和Room将数据从数据库传输到屏幕。但是如何使用POST方法实现登录活动。我需要从ViewModel或AuthorizationRepository创建LiveData isAuthorated吗?有人能展示在android架构组件中使用命令方法的示例吗?

  • 我正在玩GraphQL和Spring Boot,但我在这个问题上停留了一段时间。 首先,这是我的build.gradle: 我有一个实体,比如说-Dog,一个存储库,一个服务,一个Mutator和一个查询。在/resources中,我有。 但由于某些原因,我无法启动应用程序。错误消息如下:。当我删除对它启动,但找不到模式。 有什么想法吗?