当前位置: 首页 > 知识库问答 >
问题:

rxjava-如何正确检查maybe/observable是否为空?

陈君之
2023-03-14
@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 will是否为空,然后对其执行操作?

共有1个答案

程飞星
2023-03-14

使用single而不是maybe。因为当数据库中没有行时,可能将直接完成,而不会调用错误。但是single将导致onerror在没有行时使用emptyresultsetexception。然后我们可以使用RX的力量来返回来自网络呼叫的数据。方法如下:

首先,将itemdao.getallitems()更改为返回single > 。然后将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();
                        }
                    });
        }
 类似资料:
  • 主要内容:RxJava Observable MayBe类 介绍,RxJava Observable MayBe类 声明,RxJava Observable MayBe类 协议,RxJava Observable MayBe类 示例RxJava Observable MayBe类 介绍 MayBe 类表示延迟响应。MayBe observable 可以发出单个成功值或不发出任何值。 RxJava Observable MayBe类 声明 RxJava Observable MayBe类 协议 以

  • 问题内容: 我有一堆字符,想删除所有不是’#’‘的字符。“ E”和“ G”。 我试图用这个: 但是遇到了不兼容类型的问题。 问题答案:

  • 我有一个名为< code>Person的对象。 它有几个属性; 我设置了一个person对象,比如< code>Person p = new Person(1,“Joe”);。 1.) 我需要检查对象是否为空;以下表达式是否正确; 2.)我需要知道ID是否包含Int。 但是,java不允许这样做。我该怎么办?

  • 问题内容: 如何检查是否为空? 问题答案: 您自己说过的,请检查它是: 看,PHP非常简单。您可以简单地写下您的想法;) 这种方法很安全。如果未设置(可能,但可能),则可能会给您提供未定义的变量E_NOTICE 。

  • null 什么做法更好,更“真实”?我喜欢第一个,但再次,不确定我该如何选择Epsilon。

  • 我正在自动化一些涉及android keytool和jarsigner的东西。该工具获取一个密钥存储库、密钥存储库的密码、别名和别名/密钥的密码,我正在尝试找到一种方法来显式检查为别名/密钥提供的密码是否正确。 有什么想法吗?而且,我需要在没有要签名的jar文件的情况下检查它--在我的上下文中获取该文件是很长的,所以我希望早一点而不是晚一点中止。