【问题标题】:Room- LiveData RxJava triggered without reasonRoom- LiveData RxJava 无故触发
【发布时间】:2017-11-06 19:08:15
【问题描述】:

我有一个 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()
    }
}

Repository 有这个功能:

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

我的道:

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

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

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

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

【问题讨论】:

  • 你什么时候开始观察LiveData?这可能与您调用liveData.observe(...) 的时间和生命周期方法有关
  • @NikolaDespotoski 我开始在活动的“OnCreate”方法中观察

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多