RXJava2:链接改造请求的正确模式

2024-01-21

一般来说,我对 RXJava 比较陌生(实际上只是开始使用 RXJava2),而且我能找到的大多数文档往往是 RXJava1;现在我通常可以在两者之间进行转换,但是整个 Reactive 的东西太大了,它是一个压倒性的 API,并且有很好的文档(当你能找到它时)。我正在尝试简化我的代码,我想一步一步地完成它。我想要解决的第一个问题是我在当前项目中经常使用的常见模式:

您有一个请求,如果成功,您将用它来发出第二个请求。

如果其中一个失败,您需要能够确定哪个失败。 (主要是显示自定义 UI 警报)。

这就是我现在通常这样做的方式:

(省略了.subscribeOn/observeOn为了简单起见)

Single<FirstResponse> first = retrofitService.getSomething();

first
   .subscribeWith(
     new DisposableSingleObserver<FirstResponse>() {
         @Override
         public void onSuccess(final FirstResponse firstResponse) {

               // If FirstResponse is OK…
                Single<SecondResponse> second = 
                 retrofitService
                    .getSecondResponse(firstResponse.id) //value from 1st
                    .subscribeWith(
                      new DisposableSingleObserver<SecondResponse>() {

                           @Override
                           public void onSuccess(final SecondResponse secondResponse) {
                              // we're done with both!
                           }

                           @Override
                            public void onError(final Throwable error) {
                            //2nd request Failed, 
                            }                        
                     });

         }

         @Override
         public void onError(final Throwable error) {
              //firstRequest Failed, 
         }
      });

RXJava2中有没有更好的方法来处理这个问题?

我试过了flatMap和变化,甚至Single.zip或类似的,但我不确定处理这个问题最简单和最常见的模式是什么。

如果您想知道 FirstRequest 会获取实际的Token我需要在第二个请求中。如果没有令牌,则无法发出第二个请求。


我建议使用平面地图(并且逆转录酶 https://github.com/orfjackal/retrolambda如果这是一个选项)。 另外,您不需要保留返回值(例如Single<FirstResponse> first)如果你没有用它做任何事情。

retrofitService.getSomething()
    .flatMap(firstResponse -> retrofitService.getSecondResponse(firstResponse.id)
    .subscribeWith(new DisposableSingleObserver<SecondResponse>() {
         @Override
         public void onSuccess(final SecondResponse secondResponse) {
            // we're done with both!
         }

         @Override
          public void onError(final Throwable error) {
             // a request request Failed, 
          }                        
   });

This http://blog.danlew.net/2015/03/02/dont-break-the-chain/这篇文章帮助我思考了 RxJava 总体结构的风格。如果可能的话,您希望您的链成为高级操作的列表,以便可以将其读取为一系列操作/转换。

EDIT如果没有 lambda,你可以只使用Func1为你的平面地图。做同样的事情只是更多的样板代码。

retrofitService.getSomething()
    .flatMap(new Func1<FirstResponse, Observable<SecondResponse> {
        public void Observable<SecondResponse> call(FirstResponse firstResponse) {
            return retrofitService.getSecondResponse(firstResponse.id)
        }
    })
    .subscribeWith(new DisposableSingleObserver<SecondResponse>() {
         @Override
         public void onSuccess(final SecondResponse secondResponse) {
            // we're done with both!
         }

         @Override
          public void onError(final Throwable error) {
             // a request request Failed, 
          }                        
   }); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RXJava2:链接改造请求的正确模式 的相关文章

  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 如何以编程方式启用小米应用程序的自动启动

    我想知道小米是否可以提供任何应用程序的后台服务 我的应用程序中有需要始终在后台运行的服务 在除小米之外的所有设备中都工作正常 如何以编程方式完成 也适用于小米 oppo vivo 和 oneplus 手机 try Intent intent
  • 当 Android 上的脸部靠近屏幕时,以编程方式关闭屏幕

    我的应用程序是一个拨号器 当用户将手机靠近头部时 我需要关闭屏幕并防止单击控件 就像本机 Android 拨号器行为一样 我需要什么 API 级别以及如何以正确的方式做到这一点 我通过反汇编一个非常著名的 VoIP 应用程序找到了解决方案
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • SQLiteConstraintException:错误代码19:约束失败——Android错误

    我已经看到了一些与此相关的其他问题 但没有一个答案似乎真正适用于我的代码 当我尝试插入数据库时 出现 SQLiteConstraintException 错误代码 19 约束失败 错误 这是插入操作的代码 db insert 现在返回 1
  • 点击按钮时的 Admob 插页式广告

    我有一个应用程序 我正在使用 admob 横幅 现在我想在点击按钮时显示插页式广告 我的应用程序有 2 个活动 我想在第二个活动上显示插页式广告 第二个活动有一个返回第一个活动的按钮 我想在单击按钮后显示广告 我可以在单击按钮时显示广告 但
  • 短信管理器在少于 160 个字符时发送多部分消息

    我编写了一个使用短信管理器的应用程序 我用的方法sendTextMessage 但这行不通 现在我正在使用sendMutlipartTextMessage 这是工作 但当它大约 60 个字符时 它会发送多部分消息 这个是正常的 我读过的所有
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 为什么 CompletableFuture 的 thenAccept() 不在主线程上运行

    我在 CompletableFuture 的 SupplyAsync 中处理长时间运行的操作 并将结果放入 thenAccept 中 有时 thenAccept 在主线程上执行 但有时它在工作线程上运行 但我只想在主线程上运行 thenAc
  • 如何在按下硬件主页按钮时关闭所有活动?

    我有一个应用程序 其中有 5 个活动 一个菜单活动和另外 4 个子活动附加到菜单屏幕 所以我可以选择任何活动 然后返回菜单 假设我像这样四处走动 菜单 gt 活动 1 gt 菜单 gt 活动 3 gt 活动 2 gt 菜单 现在我按 主页
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • 无法获取 android.permission.CLEAR_APP_USER_DATA

    我正在开发需要特殊权限的系统应用程序 由于某种原因 我无法获得 CLEAR APP USER DATA 权限 但我可以使用 INSTALL PACKAGES DELETE PACKAGES 等 什么可能导致这种情况 显现 uses perm
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • 运行 Espresso 测试时在 Android studio 中找不到属性 android:forceQueryable

    我已经使用 android studio 录制了我的 Android 应用程序 Espresso 测试记录浓缩咖啡测试选项中Run菜单 在记录的最后 我用自己的文件名保存了测试 单击保存按钮后 IDE 会自动在以下位置创建文件Android
  • Android 处理 ListView 中的多个 EditText 字段

    只是一个基本问题 如果我有几十个 EditText 字段是 ListAdapter 的一部分 那么各个 EditText 字段如何知道它们属于哪一行 目前我正在使用 TextWatcher 来监听文本输入 我尝试扩展 TextWatcher
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • “mvn”不被识别为内部或外部命令、可操作程序或批处理文件

    可能是之前问过问题 但我发现了非常奇怪的错误 当我跑步时mvn versionbin 中的命令给出了版本和其他信息 但是 当我跑到垃圾箱外面时 它会出现异常 下面提到的结果 C Program Files apache maven 3 0
  • Swing GUI 出现 IntelliJ 错误“contentPane 无法设置为 null。”从终端编译时

    当我从 IntelliJ 编译我的项目时 没有任何问题 我的程序运行顺利 但是当我尝试使用 javac 从终端编译它时 警告 注意 Victor presentation TableControllerMenu java 使用未经检查或不安
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • 原生 Vim 随机数脚本

    我知道有多种方法可以获取随机数 例如从 shell 中 然而 我在 Android 手机上运行 vim 几乎没有编译 而且 它不必是严格随机的 关键是 在 Vim 中获取一系列相当好的随机数的有趣 简洁 快速 即使用 vim 原生函数 或简
  • MS Access 2010 运行时 - 连续形式中缺少鼠标右键单击上下文菜单

    我在 MS Access 2003 中编写了一个应用程序 我可以使用 Access 2010 运行该应用程序 但是当我仅使用 MS Access 2010 运行时打开同一个 2003 应用程序时 我无法再以连续形式使用鼠标右键单击 因为我可
  • 向下转型最佳实践 (C++)

    静态代码分析工具往往会大量谈论 将基类向下转换为派生类 我还发现了一些编码标准指南 其中提到不要这样做 所以我想知道什么是最佳实践方法 这是我的用例 我有一个 Base 接口 DerivedA DerivedB 类 然后是一个包含 Base
  • 如何在codeigniter中使用pdo?

    据我所知 PDO 支持最近已添加到 codeigniter 但我找不到任何有关如何实际使用它的文档或教程 谁能告诉我如何使用它 您可以编辑 application config database php并启用 PDO 驱动程序 db def
  • Java中Float的最大值?

    下列question https stackoverflow com questions 3884793 minimum values and double min value in java表示 Double 的最小值是 Double M
  • QEMU和KVM在虚拟机I/O中扮演什么角色?

    我发现 QEMU 和 KVM 之间的界限非常模糊 我发现有人说虚拟机是qemu进程 而另一些人说是kvm进程 究竟是什么 而QEMU和KVM在虚拟机I O中扮演什么角色呢 比如一个vm做PIO MMIO的时候 是qemu还是kvm会把它困住
  • matplotlib:同一张图上有2个不同的图例

    我有一个图 其中不同的颜色用于不同的参数 不同的线条样式用于不同的算法 目的是比较使用相似参数执行的不同算法的结果 这意味着我总共使用了 4 种不同的颜色和 3 种不同的线条样式 在同一张图表上总共使用了 12 个图 我实际上是根据颜色构建
  • 带有 CSS 波浪的动画文本

    怎么运行的 The png下面显示的图像被剪辑到带有动画的文本中 行动中 body background 000000 Wave Loader text transform uppercase font family Cabin Conde
  • 如何通过 SSH 协议克隆 Github Gist?

    Github 似乎确实希望我们使用 HTTPS 协议来使用 Gists 例如 他们只在 Gist 页面上列出 HTTPS url 例如https gist github com donatello 5834862 https gist gi
  • 从 Microsoft SQL 查询到 Pandas Dataframe

    我正在尝试用 Python3 编写一个程序 它将在 Microsoft SQL 中的表上运行查询并将结果放入 Pandas DataFrame 中 我的第一次尝试是下面的代码 但由于某种原因 我不明白这些列没有按照我在查询中运行它们的顺序出
  • iOS 上的 HTML5 MSE

    我正在尝试使用 Chrome Mobile 让 hls js 在 iOS 上工作 但我注意到 Chrome Mobile 不支持 MediaSourceExtensions 这绝对是必要的 iOS 是否支持 MSE Chrome 移动版 F
  • watchdog(python) - 仅监视一种文件格式并忽略“PatternMatchingEventHandler”中的所有其他内容

    我正在运行代码本文 https www thepythoncorner com 2019 01 how to create a watchdog in python to look for filesystem changes 并进行了一些
  • 设置Jest和Enzyme来测试React 15找不到模块react/lib/ReactTestUtils

    我有一个反应项目 正在尝试设置一些测试 由于以下设置指南 问题 https github com facebook jest issues 1353 https github com facebook jest issues 1353 ht
  • 对指定月份和年份的数据框进行子集化

    我有一个数据框 其中第一列是 d m y 格式的日期 第二列是数值 销售额 我想为一年中的每个月创建子集 例如 11 11 12 11 等 我尝试了这个答案中建议的代码 使用多个条件对 data frame 进行子集化 https stac
  • 仅从 perl 列表中获取某些值

    首先我会描述我所拥有的 然后是问题 我有一个这样构造的文本文件 Start of file name name2 ignore name4 jojobjim name3 name6 name9 pop gt
  • 我如何从ajax调用web api控制器

    我是 ASP MVC 和 Web api 的初学者 通过使用下面的代码 我尝试调用在控制器中编写的函数 为了进行检查 我使用了断点 因此控件无法转到控制器 因此我无法跟踪实际发生的情况 给定的代码解释了如何将用户名和密码传递给控制器
  • Python正则表达式不匹配http://

    我面临匹配和替换某些单词的问题 这些单词未包含在 http 中 当前正则表达式 http s 这符合模式http www egg1 com http www egg2 com http www egg2 com 我需要一个正则表达式来匹配
  • 应用程序启动器图标从屏幕上消失

    我试图为一个简单的应用程序设置意图过滤器来处理网址 我应用了 意图过滤器 的基本标签 例如 操作 类别 这里我使用了 2 个 意图过滤器 标签
  • 如何快速了解mscorlib?

    我想将数据读入 RSAParameters 结构 RSA参数 http msdn microsoft com en us library system security cryptography rsaparameters 28v VS 1
  • RXJava2:链接改造请求的正确模式

    一般来说 我对 RXJava 比较陌生 实际上只是开始使用 RXJava2 而且我能找到的大多数文档往往是 RXJava1 现在我通常可以在两者之间进行转换 但是整个 Reactive 的东西太大了 它是一个压倒性的 API 并且有很好的文