Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Livedata observer onChanged()仅触发一次?_Android_Mvvm_Android Livedata - Fatal编程技术网

Android Livedata observer onChanged()仅触发一次?

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

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

代码如下:

活动

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流不是唯一的原因。无论如何,当我发现其他原因和解决方案时,我会更新这篇文章。这里是我发现的一个与我的方法类似的链接: