结合 RxTextView Observable 和 Retrofit Observable

2023-12-28

作为 RxAndroid 入门的一个示例,我正在尝试实现一个搜索框,当用户插入某些内容时,该搜索框会触发休息调用。

到目前为止我有两个工作部分。首先观察EditText视图...

RxTextView.textChangeEvents(searchEditText)
    .debounce(400, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<TextViewTextChangeEvent>() {
            @Override
            public void onCompleted() {
                Timber.d("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Timber.e(e, "onError");
                }

            @Override
            public void onNext(TextViewTextChangeEvent e) {
                Timber.d("onNext" + e.text().toString());
            }
        });

...第二部分通过使用 Retrofit 服务调用 REST API:

APIManager.getService().searchRestaurants("test")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<List<Restaurant>>() {
            @Override
            public void onCompleted() {
                Timber.d("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Timber.e(e, "onError");
            }

            @Override
            public void onNext(List<Restaurant> restaurants) {
                Timber.d("onNext");
                for (Restaurant restaurant : restaurants) {
                    Timber.d(restaurant.getId() + ": " + restaurant.getName());
                }
            }
        });

我的问题是将这两部分结合起来。我尝试使用flatMap运算符如下:

RxTextView.textChangeEvents(searchEditText)
        .debounce(400, TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap(new Func1<TextViewTextChangeEvent, Observable<List<Restaurant>>>() {
            @Override
            public Observable<List<Restaurant>> call(TextViewTextChangeEvent txtChangeEvt) {
                return APIManager.getService().searchRestaurants(txtChangeEvt.text().toString());
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<List<Restaurant>>() {
            @Override
            public void onCompleted() {
                Timber.d("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Timber.e(e, "onError");
            }

            @Override
            public void onNext(List<Restaurant> restaurants) {
                Timber.d("onNext");
                for (Restaurant restaurant : restaurants) {
                    Timber.d(restaurant.getId() + ": " + restaurant.getName());
                }
            }
        });

当我这样做时,我得到以下异常:

java.lang.IllegalStateException: Must be called from the main thread. Was: Thread[RxCachedThreadScheduler-1,5,main]
                                                                              at com.jakewharton.rxbinding.internal.Preconditions.checkUiThread(Preconditions.java:28)
                                                                              at com.jakewharton.rxbinding.widget.TextViewTextChangeEventOnSubscribe.call(TextViewTextChangeEventOnSubscribe.java:21)
                                                                              at com.jakewharton.rxbinding.widget.TextViewTextChangeEventOnSubscribe.call(TextViewTextChangeEventOnSubscribe.java:12)

所以我尝试通过调用来解决这个问题subscribeOn(AndroidSchedulers.mainThread()但在这种情况下,我当然会收到 NetworkOnMainThread 异常。

那么我该怎么做呢? 组合应该在不同线程上执行的不同可观察对象的正确方法是什么?


只需删除第一个.observeOn(AndroidSchedulers.mainThread())。看看这个example https://github.com/ReactiveX/RxJava/issues/2925#issuecomment-98649659

Observable.just(1) // 1 will be emited in the IO thread pool
    .subscribeOn(Schedulers.io())
    .flatMap(...) // will be in the IO thread pool
    .observeOn(Schedulers.computation())
    .flatMap(...) // will be executed in the computation thread pool
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(); // will be executed in the Android main thread (if you're running your code on Android)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结合 RxTextView Observable 和 Retrofit Observable 的相关文章

  • 未为模块“Example-Example”指定 APK 路径

    我是 Android 应用程序开发领域的新手 我正在创建一个项目示例安卓工作室 我有我的午餐列表 java文件输入src main java apt tutorial lunchlist 直到昨天一切都工作正常 但是当我今天打开 andro
  • 我所有的布局 xml 文件都变成了自动生成的文件

    昨天我的应用程序上的所有内容都运行完美 但今天当我打开 Android Studio 时 所有 xml 文件都已损坏 不确定这是否是正确的术语 每个人都是这样的 我今天遇到了同样的问题 下面是我所做的几个步骤 我取得了成功来解决这个问题 只
  • Mono for Android,读取和写入 XLSX

    我正在使用 Mono for Android 开发一个应用程序 我需要读取和创建 XLSX Excel 文件的功能 我尝试过EPPlus和NPOI 并快速浏览了一下微软的Open XML SDK 发现了以下问题 EPPlus 需要 Wind
  • 方法调用 mActionBar=getActionBar() 给出错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用支持库android support v7 app actionbar因为我想要操作栏API 级别 8以上 但是下面的句子给了我
  • 为 DownloadManager 的 BroadcastReceiver 设置附加功能 [重复]

    这个问题在这里已经有答案了 有一种方法可以添加额外内容DownloadManager已登记行动意图DownloadManager ACTION DOWNLOAD COMPLETE 例如 接收一个在意图中设置为额外的布尔值 这就是我创建请求的
  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 如何处理应用程序对 3d party 的依赖

    我当前正在开发的应用程序依赖于第三方应用程序 OIFileManager 我的问题是处理这些依赖关系的一般方法是什么 告诉用户解决它 嵌入 3d party apk 如果其许可证允许 自动解决 也许Android市场有相应的系统 没有自动的
  • 安卓市场。 Google Checkout 和银行帐户

    请原谅 这不是一个编程问题 但它仍然与软件开发有关 所以我希望它没问题 为付费应用创建 Android 开发者帐户意味着注册一个 GoogleCheckout 帐户 这又意味着将其链接到来自这 31 个符合条件的国家 地区之一的银行帐户 有
  • 如何在phonegap上使用GCM处理android中的多个推送通知

    当推送通知到达时 如果用户无法查看该通知 他收到另一条通知 之前的通知正在更新为新的 但它不应该更新为最新的 我们需要单独显示每个通知 这可以使用 GCM 吗 我已经使用Phonegap来开发应用程序 PushPlugin 支持在有效负载中
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • CollapsingToolbarLayout 禁用绘制扩展

    我有一个已有条件禁用的 CollapsingToolbar 当用户在这种情况下加载视图时 它看起来就像一个普通的 ToolBar 对象 唯一奇怪的是 如果它们向下拖动 例如在拉动刷新样式操作中 折叠工具栏就会展开 尽管我的愿望和代码与此相反
  • AWS MobileHub:重命名 Android / iOS 示例项目

    我是 AWS Mobilehub 的新手 我喜欢它允许我使用 AWS 配置选项创建项目 但是 当我尝试构建应用程序 ios swift android 时 它总是使用我的示例项目作为项目名称 在 AWS 项目的大多数配置设置中 例如使用 c
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 从 Android 中的过渡动画中排除 BottomNavigation

    我一直在四处寻找 但找不到有助于解决这个特定问题的答案 我的应用程序有一个自定义滑入 滑出效果 如下所示 Intent intent new Intent getApplicationContext MyActivity class sta

随机推荐

  • 指向空对象的引用[重复]

    这个问题在这里已经有答案了 我看到了这个讨论 检查 C 中的 null 对象 https stackoverflow com questions 2099882 checking for a null object in c我很惊讶没有人谈
  • jQuery AutoComplete,自定义返回数据

    我正在尝试创建一个自动完成框 并且由于返回自定义数据而遇到问题 我似乎无法让它填充自动完成框 这是数据 JSON user id 1 user name jarru user id 2 user name harryq user id 3
  • 在 WooCommerce 中获取并显示所选变体 SKU

    我的代码适用于简单的产品类型 但不适用于 WooCommerce 中的可变产品 add shortcode product sku div wc product sku div function wc product sku div glo
  • Laravel 路由参数与 post 路由 vs post 参数

    路由参数应该只用于获取 删除请求吗 用户可以加入挑战 我希望为此拥有一个 API 端点 这个可以吗 Route post challenge challenge join UserController joinChallenge 或者我应该
  • fetch api 无法加载,不支持 url 方案“文件”

    我尝试使用fetch在本地主机上 但它不起作用 这是我的代码
  • 如何以动画方式删除使用 ForEach 循环创建的视图,并从 SwiftUI 中的 ObservableObject 获取其数据

    该应用程序具有以下设置 我的主视图使用 SwiftUI 创建标签云ForEach环形 这ForEach从获取其数据 Published的数组ObservableObject called TagModel 用一个Timer 每三秒Obser
  • 我是否将图像资源存储在公共或reactJS中的src中?

    我正在为我的应用程序使用 React 我有一个div我想要一张背景图片 但我无法让它显示 当我将它包含在src文件夹为myapp src bgimage png它工作得很好 但我听说我应该将它包含在名为的文件夹中images在根级别所以它是
  • 非恢复除法算法

    有谁知道使用非恢复除法除法无符号二进制整数的步骤 很难在网上找到任何好的资源 i e if A 101110 and B 010111 我们如何找到A divided by B在非恢复分裂中 每个步骤中的寄存器是什么样的 Thanks 我的
  • 指向泛型类型的指针

    在将给定的高效的基于指针的哈希图实现转换为通用哈希图实现的过程中 我偶然发现了以下问题 我有一个代表哈希节点的类 哈希映射实现使用二叉树 THashNode
  • 如何衡量编程语言的受欢迎程度?

    从此以后question https stackoverflow com questions 1311981 use of different net languages 我有兴趣了解如何衡量任何和所有编程语言的受欢迎程度 作为专业的开发者
  • Spring连接池[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Qt Creator 和主窗口背景图像

    我想添加图像作为主窗口的背景 添加此背景图片的最佳方式是什么 主窗口的其余部分必须是透明的 我想这样做QtCreator编辑器 因此 对于此组件 没有代码 您可以将背景图片添加到您的MainWindow通过执行以下操作 创建一个QPixma
  • 我无法使用 SNICallback

    我无法管理使用 SNICallbackcreateServer功能 当我尝试以下代码时 出现错误 Missing PFX or certificate pricate key 我该如何解决这个问题 var fs require fs tls
  • 如何将数据转换为矩阵格式

    我已通过 read csv 将原始数据 10000 行和 392 列 导入到 R 中 我想知道如何将其转换为矩阵格式 非常感谢您的帮助 您的问题可能会迁移到 StackOverflow 不过 答案比较简单 我会提供 read csv 会生成
  • 具有无符号短整数的结构的大小

    我在浏览我们的一份组织数据文档时发现了以下代码 struct A unsigned short int i 1 unsigned short int j 1 unsigned short int k 14 int main A aa int
  • 我是否应该将完整的网页作为 html/text 传递给休息 GET 调用

    我正在建立一个提供动态内容的网站 服务器 浏览器之间的所有通信都通过 REST 进行 PostgreSQL 用作数据存储 我的问题是对于任何 GET 请求 我是否应该动态构建 html 以及动态内容 举个例子 GET Produces Me
  • 如何用具有相同主键的本地数据库表更新远程表?

    我想从本地数据库表更新数据库的远程表 但是当我为大师更新时 我发现了主键不匹配的问题 那么是否有一种机制可以让我在本地使用相同的主键更新远程数据库表 如果我在本地删除记录 则远程主键不匹配 虽然我有两种类型的表 没有主键 也有主键 我在这里
  • 如何使用 groovy 获取 Jenkins 作业的 git scm url

    有没有办法使用 groovy 在 Jenkins 作业中获取 scm git repo url 字符串 import jenkins model import hudson model import hudson tasks import
  • 将文本文件内容传递到 Form 2

    我需要帮助 我有两个表格 第一个表单包含磁盘上带有文本文件的 listBox 但第二个表单必须显示从表单 1 的 listBox 中选择的文件的内容 Form1 中的 listBox 和 Form2 中的 richTextBox 均已公开
  • 结合 RxTextView Observable 和 Retrofit Observable

    作为 RxAndroid 入门的一个示例 我正在尝试实现一个搜索框 当用户插入某些内容时 该搜索框会触发休息调用 到目前为止我有两个工作部分 首先观察EditText视图 RxTextView textChangeEvents search