Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android应用程序中共享LiveData实例?_Android_Android Architecture Components_Android Livedata_Android Jetpack_Android Viewmodel - Fatal编程技术网

如何在android应用程序中共享LiveData实例?

如何在android应用程序中共享LiveData实例?,android,android-architecture-components,android-livedata,android-jetpack,android-viewmodel,Android,Android Architecture Components,Android Livedata,Android Jetpack,Android Viewmodel,简单用例 我正在我的应用程序中使用MVVM体系结构 用户登录后,我将获取多个网络数据,并希望能够从不同的活动生命周期访问这些数据 我不想在我的应用程序中使用 我看到了一些关于在活动之间共享视图模型或使用作为静态成员的问题,但我认为大多数情况下,我们需要在多个屏幕中访问相同的数据 我想分享一个解决方案,但如果有更好的解决方案或存在问题,请发表您的想法。想法是建立一个存储库,在消费者之间(ViewModels)共享LiveData 请注意:要刷新数据,可能会看到故障 想象一个场景,当两个活动之间发生

简单用例

我正在我的应用程序中使用MVVM体系结构

用户登录后,我将获取多个网络数据,并希望能够从不同的活动生命周期访问这些数据

我不想在我的应用程序中使用

我看到了一些关于在活动之间共享视图模型或使用作为静态成员的问题,但我认为大多数情况下,我们需要在多个屏幕中访问相同的数据

我想分享一个解决方案,但如果有更好的解决方案或存在问题,请发表您的想法。

想法是建立一个存储库,在消费者之间(ViewModels)共享LiveData

请注意:要刷新数据,可能会看到故障

想象一个场景,当两个活动之间发生转换时,第一个活动正在观察LiveData,第二个活动开始刷新它


我认为解决上述问题的方法是在第一个活动中进行刷新,然后导航到下一个活动。

如果
dataSource.getData()
是一个即时操作,这将起作用,否则UI线程将被阻塞。很好。但是我会考虑不把“结果”LIFEDATA存储在存储库中,而是把它保存在ViewModel中作为成员。我猜你已经在你的虚拟机中保存了结果数据。因此,这将减少冗余内存分配。当您共享ViewModels时,它不会被清除(),除非您销毁该活动。基本上,存储库层应该只用于数据检索,而不用于保存任何数据。@Badhrinathcanessan在这种情况下,如果我只返回
dataSource.getData()
,则附加到新
活动的每个
VM
将执行新的API调用。是的,您是正确的。我的答案是使用具有多个片段的单个活动,并跨片段共享VM。但是这个链接可能会帮助你。
class SharedLiveDataRepository(val dataSource: MyDataSource) {

    // This LiveData is shared across consumers
    private val result = MutableLiveData<Long>()

    fun loadData(): LiveData<Long> {
        if (result.value == null) {
            result.value = dataSource.getData()
        }
        return result
    }

}
  fun loadData(refresh: Boolean = false): LiveData<Long> {
        if (refresh == true) {
            result.value = null
        } 
        if (result.value == null) {
            result.value = dataSource.getData()
        }
        return result
    }