在Flowable上使用switchMap的LiveDataReactiveStreams fromPublisher问题

时间:2019-11-26 13:55:05

标签: android rx-java rx-android android-livedata

当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。

我想念什么?

0 个答案:

没有答案