Android Livedata observer onChanged()仅触发一次?
我在线关注LiveData示例,不知何故,在创建活动时,LiveData只触发一次。如果打开另一个活动来更新Oppo对象,然后返回到该活动,则不会调用onChanged()。我不知道出了什么问题。因为当我在onResume()中检查LiveData是否有活动的观察者时,它返回true 代码如下: 活动Android Livedata observer onChanged()仅触发一次?,android,mvvm,android-livedata,Android,Mvvm,Android Livedata,我在线关注LiveData示例,不知何故,在创建活动时,LiveData只触发一次。如果打开另一个活动来更新Oppo对象,然后返回到该活动,则不会调用onChanged()。我不知道出了什么问题。因为当我在onResume()中检查LiveData是否有活动的观察者时,它返回true 代码如下: 活动 oppoViewModel = ViewModelProviders.of(this).get(OppViewModel.class); OppoViewModel.setOppo(ext
oppoViewModel = ViewModelProviders.of(this).get(OppViewModel.class);
OppoViewModel.setOppo(extras.getString(RECORD_ID));
oppoViewModel
.getOpportunity()
.observe(this, oppo -> {
// Update the UI
}
);
视图模型
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()
}
}
class OppoViewModel(应用程序:应用程序):AndroidViewModel(应用程序){
私有变量oppo:MutableLiveData=MutableLiveData()
私有变量compositeDisposable=compositeDisposable()
fun setOppo(记录ID:String){
compositeDisposable.add(Single.just(RepositoryProvider.opportepository())
.getOppoByRecordId(记录ID))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(对象:DisposableSingleObserver(){
成功时覆盖乐趣(t:Oppo){
oppo.postValue(t)
}
覆盖有趣的错误(e:可丢弃){
}
}))
}
fun getOpportunity():MutableLiveData{
返回oppo
}
覆盖有趣的onCleared(){
Timber.e(“ViewModel onCleared()”)
compositeDisposable.clear()
super.onCleared()
}
}
我使用RxJava从SQLite数据库获取DB记录,在本例中使用ContentResolver。最初我认为oppo.postValue应该更改为oppo.setValue,但它仍然没有触发,但您有一个更改订阅
Single.just(RepositoryProvider.oppoRepository())
在您的情况下,LiveDate
不负责使用更新的值,您需要确保rx流在更新后会发出新的值
只有在您第一次在后台活动时触发
oppo.postValue(t)
时,才会设置新值。感谢您的回复@Igor Bykov,但我认为Rx流不是唯一的原因。无论如何,当我发现其他原因和解决方案时,我会更新这篇文章。这里是我发现的一个与我的方法类似的链接: