【问题标题】:Loading data in splash activity and share that data or ViewModel to next activity in MVVM在启动活动中加载数据并将该数据或 ViewModel 共享到 MVVM 中的下一个活动
【发布时间】:2018-12-19 13:10:59
【问题描述】:

在我的应用程序中,我需要从加载到专用视图模型中的服务器(使用改造)加载一些数据的提要。 目前发生的情况是viewmodel在它的constructor中调用repository,然后一旦获取到数据,就会通知主activity中的观察片段并相应地改变ui。

但是,假设我想在启动/启动器活动期间获取该数据,那么使用 MVVM 的实现是什么? 我的意思是,由于视图模型只与一个活动相关联,我们不能在两个活动之间共享相同的视图模型。

那么我们如何在 Launcher Activity 中加载远程服务器数据,然后在 Main Activity 中使用呢?

在这种情况下,最佳做法是什么?

【问题讨论】:

    标签: android mvvm android-architecture-components android-livedata


    【解决方案1】:

    ViewModel 和 View 之间的关系是one-to-many。这和MVP是有区别的。您可以与其他 View 共享您的 ViewModel,并且可以为每个 View 使用单独的 ViewModel。

    UPD:似乎您可以创建 1 个活动,您的 Splash 和 Main 活动的内容将是片段。因此,通过从 splash 到 main 你将只交换片段。如果您将在两个片段中创建ViewModel,如下所示:

     ViewModelProviders.of(getActivity()).get(MainViewModel.class);
    

    代替:

    ViewModelProviders.of(this).get(MainViewModel.class);
    

    您将在两个片段中获得相同的 ViewModel 实例。

    【讨论】:

    • 如何在活动 A(启动器/启动程序)和活动​​ B 中的某些片段(在主活动中保存数据 ui 的片段)之间共享视图模型?使用 ViewModelProviders 会导致两个不同的视图模型,我不正确吗?
    • @BVtp 不,看看这个方法developer.android.com/reference/android/arch/lifecycle/…。在您的 MainActivity 中,如果这些 ViewModel 属于一个类,它将为您提供与 SplashActivity 中相同的 ViewModel。 ViewModel viewModel = mViewModelStore.get(key);。因此,您的 ViewModel 将包含在之前创建的 ViewModelStore 中。
    • @BVtp 否,活动销毁后将不会保留数据。您可以在多个活动中使用 1 个视图模型,这是合法的,但 ViewModel 作为 Android 的 Arch 组件不提供共享其数据的可能性。
    • 所以基本上没有必要在 splash 中加载数据?这意味着启动画面完全没有意义?那太奇怪了..那我该怎么做呢?只有放弃 MVVM 和 livedata ?
    • 闪屏的想法是像这样加载一些数据并更新数据库或smth。因此,您不应该在完成之前要求加载数据并完成启动屏幕。所以,可能你甚至不需要它。但这只是我的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多