简单用例
我正在使用 MVVM 体系结构,并在我的应用中使用Android Architecture Components。
用户登录后,我正在获取多个网络数据,并希望从附加到不同活动生命周期的不同ViewModels进行访问。
我不想在我的应用中使用Room Persistence Library。
我已经看到一些有关在活动之间共享 ViewModel 或使用LiveData作为静态成员的问题,但是我认为大多数情况下我们需要在多个屏幕中访问相同的数据。
我想分享一个解决方案,但是如果有更好的解决方案或对此有疑问,请发表您的想法。
答案 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,第二个活动开始刷新它时。
我认为上述问题的解决方案是在第一个活动中进行刷新,然后导航到下一个活动。