1

我有一个 Activity、ViewModel、Singleton 存储库和 Room。在活动中,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())
}

我的道:

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

我有一个非常奇怪的行为:第一次创建活动时,数据被很好地获取并且一切正常。之后,我在 MainActivity 保持暂停时启动第二个活动。返回主活动后,LiveData 再次被触发,没有明显的原因。

我试图切换LiveDataReactiveStream到 justdatabase.myDao().observeData()LiveData在 Dao 中返回而不是Flowable它修复了当活动恢复时该额外触发器的奇怪行为。

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

4

1 回答 1

1

这就是PublisherLiveDatafrom 的reactivestreams工作方式。它在onInactive()方法中取消订阅发布者并重新订阅onActive().

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

我最终以方法Flowable手动订阅和清除它,而不是使用.onCleared()ViewModelreactivestreams

于 2018-02-22T13:15:13.400 回答