当LiveDataReactiveStreams将我的RxJava Flowable转换为LiveData以便与数据绑定一起使用时,我遇到了一个非常奇怪的问题。我没有收到所有更改的通知。它似乎与switchMap运算符有关(来自外部Obervable的通知正在起作用,而来自内部Observable的通知则无效)。
我的ViewModel中有该方法:
public LiveData<List<EntityListItemViewModel>> getEntities() {
Flowable<List<EntityListItemViewModel>> entityListFlowable = filterFlowable
.debounce(2000, TimeUnit.MILLISECONDS)
.distinctUntilChanged()
.switchMap(this::loadEntities); // loadEntities is calling the Room's DAO
return LiveDataReactiveStreams.fromPublisher(entityListFlowable);
}
出于测试目的(我不需要观察,因为我正在使用数据绑定),我正在尝试观察它
viewModel.getEntities().observe(getViewLifecycleOwner(), entities -> {
if (entities != null) {
Toast.makeText(App.context, "KO: never called from inner observable", Toast.LENGTH_LONG).show();
}
});
烤面包出现在所有外部可观察到的变化(filterFlowable-这是我所期望的)中,但从未出现在内部可观察到的变化(loadEntities-这不是我的期望中)。
出于测试目的,我尝试观察我的Flowable
public LiveData<List<EntityListItemViewModel>> getEntities() {
Flowable<List<EntityListItemViewModel>> entityListFlowable = filterFlowable
.debounce(2000, TimeUnit.MILLISECONDS)
.distinctUntilChanged()
.switchMap(this::loadEntities); // loadEntities is calling the Room's DAO
return entityListFlowable;
}
viewModel.getEntities()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(entities -> {
if (entities != null) {
Toast.makeText(App.context, "OK: called from both observables", Toast.LENGTH_LONG).show();
}
}
);
在这里,当EntityListFlowable或loadEntities获得新值时收到通知,一切工作正常。
最后,最后一次测试,如果我将getEntities更改为
public LiveData<List<EntityListItemViewModel>> getEntities() {
return LiveDataReactiveStreams.fromPublisher(this.loadEntities("my string"));
}
再一次,一切正常(除非我没有收到EntityListFlowable更改的通知,这是正常的,所以我不再称呼它了。)
我正在使用androidx.lifecycle:lifecycle-reactivestreams:2.1.0。
我想念什么?