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

时间:2018-04-04 09:07:18

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

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

return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());

但是,即使数据库中有对象,switchIfEmpty也会意外地工作,因为它总是被调用。

gradle.properties
  1. 是否可以仅使用toObservable()将Maybe转换为Observable?
  2. 有没有其他方法可以检查Maybe是否为空,然后对其采取行动?

2 个答案:

答案 0 :(得分:4)

使用Single代替Maybe。因为当db中没有行时,Maybe将直接完成而不会调用错误。但是,如果没有行,SingleonErrorEmptyResultSetException结果。然后我们可以使用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();
                        }
                    });
        }

答案 1 :(得分:0)

调用getResultsFromNetwork的原因不是将其返回值传递给switchIfEmpty而不是其引用吗?

我会将其更改为例如

getResultsFromDatabase().toObservable().switchIfEmpty(Maybe.Callable(this::getResultsFromNetwork))

看看是否有帮助