android - Rxjava - 如何正确检查 Maybe/Observable 是否为空?

标签 android rx-java rx-java2 android-room

我正在使用 Maybe 访问数据库,我的目标是在 Maybe 完成时调用网络,表明数据库中没有数据(我正在使用房间)。我有以下功能:

@Override
public Observable<List<Item>> getResults() {
    return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
}

@Override
public Observable<List<Item>> getResultsFromNetwork() {
    System.out.println("getting results from network");
    return api.getData().doOnNext(new Consumer<List<Item>>() {
        @Override
        public void accept(List<Item> items) throws Exception {
            itemDao.insert(items);
        }
    });
}

@Override
public Maybe<List<Item>> getResultsFromDatabase() {
    System.out.println("getting coins from database");
    return itemDao.getAllItems();
}

但是,switchIfEmpty 的工作有点出乎意料,因为它总是被调用,即使数据库中有对象也是如此。

return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
  1. 是否可以仅使用 toObservable() 将 Maybe 转换为 Observable?
  2. 是否有另一种方法来检查 Maybe 是否为空然后对其执行操作?

最佳答案

使用 Single而不是 Maybe .因为当数据库中没有行时,Maybe会直接完成,不会调用错误。但是Single将导致 onErrorEmptyResultSetException当没有行时。然后我们可以使用 Rx 的功能从网络调用返回数据。方法如下:

首先改变你的itemDao.getAllItems()返回 Single<List<Item>> . 然后改getResultsFromDatabase()返回 Single以及:

@Override
public Single<List<Item>> getResultsFromDatabase() {
    System.out.println("getting coins from database");
    return itemDao.getAllItems();
}

现在你需要使用onErrorResumeNext为了从网络调用返回数据,所以改变getResults()到:

@Override
public Observable<List<Item>> getResults () {
            return getResultsFromDatabase()
                    .toObservable()
                    .onErrorResumeNext(new ObservableSource<List<Item>>() {
                        @Override
                        public void subscribe(io.reactivex.Observer<? super List<Item>> observer) {
                            getResultsFromNetwork();
                        }
                    });
        }

关于android - Rxjava - 如何正确检查 Maybe/Observable 是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646991/

相关文章:

java - 使用 CAMERA 时应用程序崩溃 - Android

android - Dagger v2 : Inject 2 different scopes into one object

java - RxJava - 使用 Single.Error/Observable.error 与抛出异常

android - fromCallable 中的 RXjava2 方法没有被执行

java - RxJava - 测试 Single.zip() 以确保执行所有参数

Android studio com.google.ar.sceneform.ux.ArFragment 与 androidx.fragment.app.Fragment 不兼容

android - 巴士座位安排与RedBus,Android相同

java - 测试可观察值仅评估一次

java - 无需递归对可观察结果进行分页 - RxJava

java - 当每个元素上的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定