gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:26:36 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com