gpt4 book ai didi

android - Room- LiveData RxJava 无故触发

转载 作者:行者123 更新时间:2023-11-30 00:16:35 25 4
gpt4 key购买 nike

我有一个 Activity、ViewModel、Singleton 存储库和 Room。在 activitiy 的 OnCreate 中,我创建了 ViewModel:

viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
viewModel.myData.observe(this, Observer { data ->
Log.d("livedata","triggred")
})

主视图模型:

class MyWorkoutViewModel (application: Application) : AndroidViewModel(application) {
// Getting the singleton repository
private var repository = (application as MyApp).repository

val myData: LiveData<Int> by lazy {
repository.getData()
}
}

存储库有这个功能:

fun getData(): LiveData<Int> {
return LiveDataReactiveStreams.fromPublisher(database.myDao()
.observeData())
}

MyDao:

@Query("SELECT COUNT(*) FROM my_table")
fun fetchData(): Flowable<Int>

我有一个非常奇怪的行为:第一次创建 Activity 时,数据提取正常,一切正常。之后,我启动第二个 Activity ,而 MainActivity 保持暂停状态。返回主 Activity 后,由于没有明显原因,LiveData 再次被触发。

我尝试将 LiveDataReactiveStream 切换为 database.myDao().observeData() 并在 Dao 中返回 LiveData 而不是 Flowable,它修复了恢复 Activity 时该额外触发器的奇怪行为。

但是,我需要使用 use 或 rxjava 来执行更复杂的操作和线程。知道为什么触发会发生吗?

最佳答案

这就是 reactivestreams 中的 PublisherLiveData 的工作原理。它在 onInactive() 方法中取消订阅发布者,并在 onActive() 中重新订阅。

因此,当您返回主 Activity 时,onActive() 触发,PublisherLiveData 重新订阅 Flowable,由您的存储库返回,并且您从存储库接收数据.

我最终订阅了 Flowable 并在 ViewModelonCleared() 方法中手动清除它并且不使用 reactivestreams

关于android - Room- LiveData RxJava 无故触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com