Java 如果我们使用基于单个活动的体系结构,视图模型可能会很重
正如谷歌建议的那样,基于单个活动的应用程序。我有一个需要澄清的情况 我有一个包含3个片段的活动,每个片段都链接到具有其他屏幕的不同片段Java 如果我们使用基于单个活动的体系结构,视图模型可能会很重,java,android,kotlin,mvvm,android-jetpack,Java,Android,Kotlin,Mvvm,Android Jetpack,正如谷歌建议的那样,基于单个活动的应用程序。我有一个需要澄清的情况 我有一个包含3个片段的活动,每个片段都链接到具有其他屏幕的不同片段 我应该为每个选项卡只使用一个视图模型,还是应该使用一个具有不同屏幕的视图模型 因为我只有一个活动,视图模型一直驻留到活动被销毁。我将为每个屏幕创建的所有视图模型都将包含数据,直到活动被销毁。如果是这种情况,它会使我的应用程序沉重 每个片段本身通常应该有一个ViewModel,但在某些情况下,如果您希望共享同一个ViewModel实例,则可以使用一个 获取View
ViewModelStore
存在时才有效。因此,如果您有一个与片段关联的ViewModel,那么它只会在该片段存在的情况下继续存在。例如,如果该片段从后面弹出,或者调用remove()
,则ViewModel将被销毁。如果使用活动作为viewmodelstorehowner
(例如,使用ViewModelProvider(活动)
)专门创建视图模型,则视图模型的有效期仅与活动的有效期相同
ViewModelStore
存在时才有效。因此,如果您有一个与片段关联的ViewModel,那么它只会在该片段存在的情况下继续存在。例如,如果该片段从后面弹出,或者调用remove()
,则ViewModel将被销毁。如果使用活动作为viewmodelstorehowner
(例如,使用ViewModelProvider(活动)
)专门创建视图模型,则视图模型的有效期仅与活动的有效期相同
我应该为每个选项卡只使用一个视图模型,还是应该使用一个视图
有不同屏幕的模型
在单活动体系结构中,您可以将ViewModel与活动范围或片段范围一起使用。正如@ianhanniballake在他的回答中所建议的,将ViewModel与Fragment一起使用,这意味着您案例中的每个选项卡都将有自己的ViewModel附加到Fragment。这将为每个选项卡中的功能提供分离关注点
因为我只有一个活动,视图模型一直驻留到活动结束
摧毁。我将为每个屏幕创建的所有viewModel都将
包含数据,直到活动被销毁。如果是这样,会吗
使我的应用程序沉重
同样,这个问题的答案与您的第一个问题和提供的解释有关
在使用单活动体系结构时,尽可能缩小范围。仅使用与活动关联的ViewModel(我们称之为全局ViewModel)来保存跨多个片段使用的数据。这样,viewmodel将包含数据,直到活动处于backbackback状态,片段可以在需要时使用它。
这将为您提供两个优势
- ViewModel将不包含您在第二个问题中提到的其他数据
- 最重要的是,在多次访问片段时,不会出现任何数据差异。例如,如果您打开任何片段,从api中获取数据并将其保存在全局ViewModel中,并且在从backstack中删除片段时未能将其删除,则您的片段将在下次打开片段时显示旧的/过时的数据。为了避免这种情况,最好将此数据保留在具有片段范围的viewmodel中