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

时间:2019-06-10 07:08:02

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

简单用例

我正在使用 MVVM 体系结构,并在我的应用中使用Android Architecture Components

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

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

我已经看到一些有关在活动之间共享 ViewModel 或使用LiveData作为静态成员的问题,但是我认为大多数情况下我们需要在多个屏幕中访问相同的数据。

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

1 个答案:

答案 0 :(得分:0)

想法是拥有一个Singleton 存储库,该存储库在使用者( ViewModels )之间共享一个 LiveData

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
    }

请注意::刷新数据可能会出现毛刺。

想象一个场景,当两个活动之间存在过渡并且第一个活动正在观察LiveData,第二个活动开始刷新它时。

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