Livedata观察者onChanged()仅触发一次?

时间:2018-08-10 22:08:06

标签: android mvvm android-livedata

我正在在线关注LiveData示例,因此创建活动时,以某种方式仅触发一次LiveData。如果我打开另一个活动来更新Oppo对象,然后返回到该活动,则不会调用onChanged()。我不确定出了什么问题。因为当我检查LiveData的onResume()中是否有活动的观察者时,它仍然返回true。

下面是代码:

活动

oppoViewModel = ViewModelProviders.of(this).get(OppViewModel.class);
    OppoViewModel.setOppo(extras.getString(RECORD_ID));
    oppoViewModel
            .getOpportunity()
            .observe(this, oppo -> {
                // Update the UI
            }
    );

ViewModel

class OppoViewModel(application: Application) : AndroidViewModel(application) {

private var oppo: MutableLiveData<Oppo> = MutableLiveData()
private var compositeDisposable = CompositeDisposable()

fun setOppo(recordId: String) {

    compositeDisposable.add(Single.just(RepositoryProvider.oppoRepository()
            .getOppoByRecordId(recordId))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<Oppo>() {
                override fun onSuccess(t: Oppo) {
                    oppo.postValue(t)
                }

                override fun onError(e: Throwable) {
                }
            }))
}

fun getOpportunity(): MutableLiveData<Opp> {
    return oppo
}

override fun onCleared() {
    Timber.e("ViewModel onCleared()")
    compositeDisposable.clear()
    super.onCleared()
}
}

我正在使用RxJava从SQLite数据库获取数据库记录,并在这种情况下使用ContentResolver。最初我认为oppo.postValue应该更改为oppo.setValue,但仍然不会触发

1 个答案:

答案 0 :(得分:0)

但是您只订阅一个更改

Single.just(RepositoryProvider.oppoRepository())

对于您来说,LiveDate并不承担消耗更新值的责任,您需要确保您的rx流在更新后会发出新值。

只有在您的第一个活动在后台时触发oppo.postValue(t)时,才会设置新值。