Комната - LiveData RxJava срабатывает без причины

У меня есть Activity, ViewModel, репозиторий Singleton и Room. В Activity 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() и вернуть LiveData в Dao вместо Flowable, и это исправило странное поведение этого дополнительного триггера при возобновлении активности.

Однако мне нужно использовать или rxjava для более сложных действий и потоковой передачи. Есть идеи, почему срабатывает этот триггер?


person Ilya Sosis    schedule 06.11.2017    source источник
comment
Когда вы начнете наблюдать LiveData? Вероятно, это связано с тем, когда и в каком методе жизненного цикла вы вызываете liveData.observe(...)   -  person Nikola Despotoski    schedule 10.11.2017
comment
@NikolaDespotoski Я начинаю наблюдать в методе OnCreate активности   -  person Ilya Sosis    schedule 12.11.2017


Ответы (1)


Так работает PublisherLiveData из reactivestreams. Он отписывается от издателя методом onInactive() и повторно подписывается в onActive().

Итак, когда вы вернетесь к своей основной деятельности, onActive() триггерам, PublisherLiveData повторно подписываетесь на Flowable, возвращаемую вашим репозиторием, и вы получаете данные из репозитория.

В итоге я подписался на Flowable и очистил его вручную onCleared() методом ViewModel и не использовал reactivestreams.

person mol    schedule 22.02.2018