RxJava 的后备 Observable

2023-12-31

我正在寻找一种更好的方法来实现使用 RxJava 时针对空结果的简单 Observable 后备系统。这个想法是,如果对一组数据的本地查询导致零项,则应该进行回退查询(可能是网络调用或其他查询)。目前,我的代码包含以下内容:

Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
     List<Object> results = queryLocalDatabase();
     if (results.isEmpty()) {
       subscriber.onError(new Throwable("Empty results"));
     } else {
       // Process results...
     }
  }
}).onErrorResumeNext(/* Fallback Observable goes here */);

尽管这可行,但为空结果集引发异常并没有多大意义。我注意到有可用的条件运算符,例如isEmpty,但它似乎并没有让我到达我想去的地方。例如,使用isEmpty...

localObservable = Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
     List<Object> results = queryLocalDatabase();
     for (Object obj : results) {
       // Process object
       subscriber.onNext(object);           
     }
     subscriber.onCompleted();
  }
});

localObservable.isEmpty()
  .switchMap(new Func1<Boolean, Observable<? extends Object>>() {
    @Override
    public Observable<? extends Object> call(Boolean isEmpty) {
      if (isEmpty) {
        // Return fallback Observable.
        return fallbackObservable;
      }

      // Return original Observable, which would mean running the local query again... Not desired.
      return localObservable;
    }
  });

这几乎让我到达了我想去的地方,除了localObservable如果存在非空项目,则似乎会运行两次,这是一个破坏交易的情况。


Use switchIfEmpty操作员。

有使用示例:

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        // return no item
        //subscriber.onNext(...);
        System.out.println("Generating nothing :)");
        subscriber.onCompleted();
    }
}).switchIfEmpty(Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        System.out.println("Generating item");
        subscriber.onNext("item");
        subscriber.onCompleted();
    }
})).subscribe(new Observer<String>() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError");
    }

    @Override
    public void onNext(String s) {
        System.out.println("onNext: " + s);
    }
});

用 lambda 简化:

Observable.create(subscriber -> {
    // return no item
    //subscriber.onNext(...);
    System.out.println("Generating nothing :)");
    subscriber.onCompleted();
}).switchIfEmpty(Observable.create(subscriber -> {
    System.out.println("Generating item");
    subscriber.onNext("item");
    subscriber.onCompleted();
})).subscribe(
    s -> System.out.println("onNext: " + s),
    throwable -> System.out.println("onError"),
    () -> System.out.println("onCompleted")
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxJava 的后备 Observable 的相关文章

随机推荐

  • 如果释放不干净的设备上下文会发生什么?

    通常 如果程序将一个对象选择到设备上下文中 或者更改其属性 则应该在释放设备上下文之前将它们更改回来 如果不这样做会发生什么 假设我这样做 HDC hdc GetDC some window SelectObject hdc some fo
  • Nokogiri 抓取带有格式和链接标签的文本,

    如何使用 Nokogiri 递归捕获带有格式标记的所有文本 div This is text in the TD with strong strong strong tags p This is a child node with b bo
  • 请解释一下 Option 的 orNull 方法的使用

    Scala 的 Option 类有一个orNull方法 其签名如下所示 orNull A1 gt A implicit ev lt lt Null A1 A1 我对隐含的东西感到困惑 有人可以解释一下如何使用它 最好是举个例子吗 scala
  • 在 Python 中使用多个代码文件和文件夹

    我是 Python 新手 还没有找到在多个代码文件和文件夹中分离代码的简单方法 我今天所做的是 为每个文件夹创建一个 init py文件 有时它是空的 我不知道为什么要这样做 但这似乎是必要的 这是与使用 C 的第一个区别 第二个区别是 对
  • facebook FB.Event.subscribe('auth.authResponseChange') 不起作用

    对于我的一生 我无法让 Event subscribe auth auth Response Change 工作 请参阅下面的代码 div div
  • 如何在C#中使用WCF REST服务?

    我的合同详细信息如下 我使用 Json 响应和请求格式 还使用 POST 方法 如何用 C 编写客户端来使用此服务 OperationContract WebInvoke UriTemplate RESTJson Sample1 Sampl
  • Firebase 身份验证 Javascript:用于重定向待处理凭据的 setCookie

    我正在尝试使用多重身份验证进行链接singinwithredirect 我抓住了错误 credential并使用JSON stringify通过 cookie 传递它 从那里 我使用以下方法将其转换回对象JSON parse 但是当我尝试将
  • 富文本 (YUI) 编辑器在 IE11 上损坏

    我正在运行 Internet Explorer 11 和 YUI 2 富文本编辑器似乎无法正常工作 有关更多详细信息 请参阅随附的屏幕截图 有什么想法如何在 IE11 下解决这个问题吗 由于IE改变了它的User Agent YUI 2 9
  • Android Studio 初始化“com.intellij.util.net.ssl.CertificateManager”时发生致命错误

    当我将Android Studio 3 0升级到3 1时出现这个问题 java lang RuntimeException com intellij ide plugins PluginManager StartupAbortedExcep
  • 使用 Python 检测 C 文件中的递归

    我需要检测相当大 5 15 000 的 C 不是 C 文件集中的直接和间接递归 文件已经过预处理 出于安全原因 该代码相当 老派 因此没有诸如函数指针之类的奇特东西 只有传递变量的函数和一些执行相同操作的函数宏 检测递归的最自然的方法是创建
  • 实体框架-“不允许新事务,因为会话中还有其他线程正在运行”

    我在尝试保存实体框架中的更改时收到以下错误 System Data SqlClient SqlException 不允许新事务 因为会话中还有其他线程正在运行 我已经看到了这个问题的各种答案 但我似乎无法让它们中的任何一个工作 基本上我在存
  • 增加 Azure Api 应用程序中的最大请求长度

    我创建了一个 Azure Api 应用程序 将用它来上传文件 这些文件将 gt 4mb 因此需要增加最大请求长度 我已将以下内容添加到 Web config
  • 取消 UNNotificationRequest

    Because UILocalNotification现已弃用 我将代码移至新版本UNNotificationRequest API 它指出 取消本地通知 在 iOS 10 0 中已弃用 使用 UserNotifications Frame
  • 缺少 git 提交

    在工作中 这种情况经常发生 有人不小心将一些东西提交到 master 而不是预期的功能分支 然后这个人尝试解决它 结果却突然消失了 我进行了仔细的搜索 但找不到任何文档来解释为什么会发生这种情况 或者如何纠正这种情况 以下是重现步骤 git
  • 尽管有有效的 SSH 密钥,仍无法将 git 存储库推送到 Heroku

    有很多堆栈文章引用了与我收到的相同的错误消息 我在另一台计算机上浏览了整个 heroku 设置文档 一切都运行良好 不知道为什么这个不起作用 但我需要它 当我跑步时 gt git push v heroku master Pushing t
  • 在 Html.ActionLink 中添加图像

    我试图创建一个选项来在 ASP net MVC 带有剃刀视图引擎 中的列表视图和小部件视图之间切换 但是 我在尝试添加图像并将其缩放到 正确的高度 与其旁边的高度相同 时遇到了一些麻烦 我一直在寻找创建类似的东西 期望的结果 List Vi
  • IIS7 中的“经典”和“集成”管道模式有什么区别?

    昨晚我正在部署一个 ASP NET MVC 应用程序 发现将 IIS7 设置为集成模式进行部署会减少工作量 我的问题是有什么区别 使用其中一种或另一种会有什么影响 经典模式 IIS6及以下版本中的唯一模式 是IIS仅直接与ISAPI扩展和I
  • R包中的源文件

    我正在构建一个非常基本的 R 包供我自己使用 有些文件需要另一个文件中的函数 因此 R 文件尝试获取 R 文件 这在构建过程中失败 两者都不 source util R nor source util R 工作 R 找不到该文件 所有文件都
  • 无法在 Android Nougat 通知的小图标中使用黄色

    我在 Android 7 x 中将通知小图标设置为黄色时遇到问题 我在用着notification setColor Color YELLOW 在构建通知对象时 它显示橄榄色而不是黄色 也尝试过使用notification setColor
  • RxJava 的后备 Observable

    我正在寻找一种更好的方法来实现使用 RxJava 时针对空结果的简单 Observable 后备系统 这个想法是 如果对一组数据的本地查询导致零项 则应该进行回退查询 可能是网络调用或其他查询 目前 我的代码包含以下内容 Observabl
Powered by Hwhale