我有一个Activity,ViewModel,Singleton存储库和Room。
在活动OnCreate
中,我创建了ViewModel:
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
viewModel.myData.observe(this, Observer { data ->
Log.d("livedata","triggred")
})
MainViewModel:
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>
我有一个非常奇怪的行为: 第一次创建活动时,数据被提取得很好并且一切正常。之后,我在MainActivity保持暂停状态时启动第二个活动。返回主活动后,无可原因再次触发LiveData。
我尝试将LiveDataReactiveStream
切换为database.myDao().observeData()
并在Dao中返回LiveData
而不是Flowable
,并修复了恢复活动时该额外触发器的奇怪行为。
但是我需要使用或rxjava来处理更复杂的操作和线程。知道为什么会发生这种触发吗?
答案 0 :(得分:1)
这是PublisherLiveData
reactivestreams
的工作原理。它取消订阅onInactive()
方法中的发布商,并在onActive()
中重新订阅。
因此,当您返回主活动时,onActive()
触发,PublisherLiveData
重新订阅Flowable,由您的存储库返回,并从存储库接收数据。
我最终订阅Flowable
并使用onCleared()
ViewModel
方法手动清除它,并且不使用reactivestreams
。