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

标签 android android-architecture-components android-livedata android-jetpack android-viewmodel

简单用例

我正在使用 MVVM 建筑和Android Architecture Components在我的应用程序中。

用户登录后,我正在获取多个网络数据并希望从不同的 ViewModels 访问它附不同 Activity 生命周期。

我不想使用 Room Persistence Library在我的应用程序中。

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

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

最佳答案

这个想法是有一个 Singleton 存储库 , 共享一个 实时数据 消费者之间( ViewModels )。

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
    }

}
如果出于某种原因您想刷新数据,loadItem方法看起来像这样
  fun loadData(refresh: Boolean = false): LiveData<Long> {
        if (refresh == true) {
            result.value = null
        } 
        if (result.value == null) {
            result.value = dataSource.getData()
        }
        return result
    }
请注意:为了刷新数据,可能会看到故障。
想象一个场景,两个 Activity 之间有转换,第一个是观察 LiveData,第二个开始刷新它。
我认为上述问题的解决方案是在第一个 Activity 中进行刷新,然后导航到下一个 Activity 。

关于android - 如何在 Android 应用程序中共享 LiveData 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56521969/

相关文章:

android - 如何将单选按钮放在文本旁边? - flutter

android - Android 系统服务监听器是否已本地化到我的应用程序实例?

android - Paging库在向上滑动刷新后只调用LoadInitial,不调用LoadAfter

Android 架构组件、android 绑定(bind)和 LiveData

android - 协程 - 单元测试 viewModelScope.launch 方法

android - 如何取消正在运行的 LiveData 协程 block

android - React-native 打开另一个应用

android - 更新 MergeAdapter/SectionedAdapter

android - StartActivityForResult 与 MVVM 架构组件

android - Mediator LiveData的addSource onChange回调是默认在主线程执行的吗?