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

How to share an instance of LiveData in android app?

简单用例

我在我的应用程序中使用 MVVM 架构和 Android Architecture Components

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

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

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

我想分享一个解决方案,但如果有更好的解决方案或有问题,请post提出您的想法。

想法是有一个 Singleton Repository,它在消费者之间共享一个 LiveData 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
    }

请注意:刷新数据可能会出现故障。

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

我认为解决上述问题的方法是先刷新 activity 然后导航到下一个。