Java 如果我们使用基于单个活动的体系结构,视图模型可能会很重

Java 如果我们使用基于单个活动的体系结构,视图模型可能会很重,java,android,kotlin,mvvm,android-jetpack,Java,Android,Kotlin,Mvvm,Android Jetpack,正如谷歌建议的那样,基于单个活动的应用程序。我有一个需要澄清的情况 我有一个包含3个片段的活动,每个片段都链接到具有其他屏幕的不同片段 我应该为每个选项卡只使用一个视图模型,还是应该使用一个具有不同屏幕的视图模型 因为我只有一个活动,视图模型一直驻留到活动被销毁。我将为每个屏幕创建的所有视图模型都将包含数据,直到活动被销毁。如果是这种情况,它会使我的应用程序沉重 每个片段本身通常应该有一个ViewModel,但在某些情况下,如果您希望共享同一个ViewModel实例,则可以使用一个 获取View

正如谷歌建议的那样,基于单个活动的应用程序。我有一个需要澄清的情况

我有一个包含3个片段的活动,每个片段都链接到具有其他屏幕的不同片段

  • 我应该为每个选项卡只使用一个视图模型,还是应该使用一个具有不同屏幕的视图模型

  • 因为我只有一个活动,视图模型一直驻留到活动被销毁。我将为每个屏幕创建的所有视图模型都将包含数据,直到活动被销毁。如果是这种情况,它会使我的应用程序沉重

  • 每个片段本身通常应该有一个ViewModel,但在某些情况下,如果您希望共享同一个ViewModel实例,则可以使用一个

  • 获取ViewModel时,ViewModel对象的作用域为传递给ViewModelProvider的生命周期它位于上,您可能需要在那里阅读其他详细信息,但从技术上讲,您可以将ViewModel的作用域定为片段或活动

  • 每个片段本身通常应该有一个ViewModel,但在某些情况下,如果您希望共享同一个ViewModel实例,则可以使用一个

  • 获取ViewModel时,ViewModel对象的作用域为传递给ViewModelProvider的生命周期它位于上,您可能需要在那里阅读其他详细信息,但从技术上讲,您可以将ViewModel的作用域定为片段或活动

  • 我应该为每个选项卡只使用一个视图模型,还是应该使用一个具有不同屏幕的视图模型
  • 应尽可能为每个ViewModel使用最小的范围。通常,这意味着仅与一个片段关联的数据应使用仅与该片段关联的ViewModel

  • 因为我只有一个活动,视图模型一直驻留到活动被销毁。我将为每个屏幕创建的所有视图模型都将包含数据,直到活动被销毁。如果是这种情况,它会使我的应用程序沉重
  • ViewModels仅在其所连接的
    ViewModelStore
    存在时才有效。因此,如果您有一个与片段关联的ViewModel,那么它只会在该片段存在的情况下继续存在。例如,如果该片段从后面弹出,或者调用
    remove()
    ,则ViewModel将被销毁。如果使用活动作为
    viewmodelstorehowner
    (例如,使用
    ViewModelProvider(活动)
    )专门创建视图模型,则视图模型的有效期仅与活动的有效期相同

  • 我应该为每个选项卡只使用一个视图模型,还是应该使用一个具有不同屏幕的视图模型
  • 应尽可能为每个ViewModel使用最小的范围。通常,这意味着仅与一个片段关联的数据应使用仅与该片段关联的ViewModel

  • 因为我只有一个活动,视图模型一直驻留到活动被销毁。我将为每个屏幕创建的所有视图模型都将包含数据,直到活动被销毁。如果是这种情况,它会使我的应用程序沉重
  • ViewModels仅在其所连接的
    ViewModelStore
    存在时才有效。因此,如果您有一个与片段关联的ViewModel,那么它只会在该片段存在的情况下继续存在。例如,如果该片段从后面弹出,或者调用
    remove()
    ,则ViewModel将被销毁。如果使用活动作为
    viewmodelstorehowner
    (例如,使用
    ViewModelProvider(活动)
    )专门创建视图模型,则视图模型的有效期仅与活动的有效期相同

    我应该为每个选项卡只使用一个视图模型,还是应该使用一个视图 有不同屏幕的模型

    在单活动体系结构中,您可以将ViewModel与活动范围或片段范围一起使用。正如@ianhanniballake在他的回答中所建议的,将ViewModel与Fragment一起使用,这意味着您案例中的每个选项卡都将有自己的ViewModel附加到Fragment。这将为每个选项卡中的功能提供分离关注点

    因为我只有一个活动,视图模型一直驻留到活动结束 摧毁。我将为每个屏幕创建的所有viewModel都将 包含数据,直到活动被销毁。如果是这样,会吗 使我的应用程序沉重

    同样,这个问题的答案与您的第一个问题和提供的解释有关

    在使用单活动体系结构时,尽可能缩小范围。仅使用与活动关联的ViewModel(我们称之为全局ViewModel)来保存跨多个片段使用的数据。这样,viewmodel将包含数据,直到活动处于backbackback状态,片段可以在需要时使用它。 这将为您提供两个优势

    • ViewModel将不包含您在第二个问题中提到的其他数据
    • 最重要的是,在多次访问片段时,不会出现任何数据差异。例如,如果您打开任何片段,从api中获取数据并将其保存在全局ViewModel中,并且在从backstack中删除片段时未能将其删除,则您的片段将在下次打开片段时显示旧的/过时的数据。为了避免这种情况,最好将此数据保留在具有片段范围的viewmodel中
    我希望这将是有用的

    我应该为每个选项卡只使用一个视图模型,还是应该使用一个视图 有不同屏幕的模型

    在单活动体系结构中,您可以将ViewModel与活动范围或片段范围一起使用。正如@ianhanniballake在他的回答中所建议的,将ViewModel与Fragment一起使用,这意味着您案例中的每个选项卡都将有自己的ViewModel附加到Fragment。这将为每个选项卡中的功能提供分离关注点

    因为我只有一项活动