Room- LiveData RxJava无故启动

时间:2017-11-06 19:08:16

标签: android rx-java2 android-room android-architecture-components android-livedata

我有一个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来处理更复杂的操作和线程。知道为什么会发生这种触发吗?

1 个答案:

答案 0 :(得分:1)

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

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

我最终订阅Flowable并使用onCleared() ViewModel方法手动清除它,并且不使用reactivestreams