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

Krz*_*ski 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
Run Code Online (Sandbox Code Playgroud)
  1. 是否可以仅使用toObservable()将Maybe转换为Observable?
  2. 还有另一种方法可以检查Maybe是否为空然后对其采取行动?

San*_*iya 5

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

首先更改您itemDao.getAllItems()的退货Single<List<Item>>。然后更改getResultsFromDatabase()为return Single,如:

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

现在您需要使用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();
                        }
                    });
        }
Run Code Online (Sandbox Code Playgroud)