Android 中的 RxJava 异步任务

2023-11-22

我正在尝试在 Android 中使用 RxJava 实现异步任务。 我尝试了以下代码,但没有成功。它在 UI 线程上执行。我正在使用以下版本的 RxAndroid 0.24.0。

try {
    Observable.just(someMethodWhichThrowsException())
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(s -> onMergeComplete());
}
catch (IOException e) {
    e.printStackTrace();
}

但是,以下内容对我来说是异步工作的。

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            try {
                someMethodWhichThrowsException();
            } catch (IOException e) {
                e.printStackTrace();
            }

            subscriber.onCompleted();
        }
    });
    observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe();

我试图理解以下内容:

  1. 它们之间有什么区别?
  2. 创建异步任务时的最佳实践是什么?

  1. 它们之间有什么区别?
Observable.just(someMethodWhichThrowsException())
    .subscribeOn(Schedulers.newThread())

这相当于以下内容:

Object someResult = someMethodWhichThrowsException();
Observable.just(someResult)
    .subscribeOn(Schedulers.newThread())

正如您所看到的,这首先调用同步方法,then将其传递给Observable.just成为一个可观察者。

Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            ...
        }
    })
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe();

但是,此方法将运行call block 订阅中。你已经告诉它你想订阅一个新线程(subscribeOn(Schedulers.newThread())),因此订阅发生在一个新线程上,并且在订阅上运行的代码(callblock)也在该线程上运行。这与调用类似的行为Observable.defer.

  1. 创建异步任务时的最佳实践是什么?

好吧,这取决于您和您想要的行为。有时您希望异步代码立即开始运行(在这种情况下,您可能希望使用其中一个运算符来缓存它)。我肯定会考虑使用异步实用程序为此的图书馆。

其他时候,您会希望它仅在订阅上运行(这是此处示例中的行为) - 例如,如果存在副作用,或者如果您不关心它何时运行而只想使用内置的-ins 从 UI 线程中获取一些内容。丹·卢提到 that Observable.defer在转换为 Rx 期间,非常方便地获取旧代码并将其从 UI 线程中取出。

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

Android 中的 RxJava 异步任务 的相关文章

  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn

随机推荐

  • 性能 iText 与 PdfBox (2014)

    我正在尝试将 pdf 我最喜欢的书 Effective Java 如果重要的话 转换为文本 我检查了 iText 和 Apache PdfBox 我发现性能有很大差异 使用 iText 需要 2 分 521 秒 使用 PdfBox 需要 6
  • 谜题:在一次解析中对一组 0 和 1 进行排序。

    是否可以在一次解析中按降序排列仅由 1 和 0 组成的数组而不使用辅助数组 例如 假设你有一个数组a 1 0 0 0 1 0 1 为此 预期输出将是a 1 1 1 0 0 0 0 我写了下面的 C 代码 但它在两次解析中找到了解决方案 可以
  • C++ 64位int:按引用传递或按值传递

    这是一个关于 64 位整数的效率问题 假设我不需要修改 int 参数的值 我应该通过值还是引用传递它 假设32位机器 1 32位整数 Iguess答案是 按值传递 因为 按引用传递 将产生额外的内存查找开销 2 64位int 如果我通过引用
  • 在R中的字符串中的两个字母之间添加空格[重复]

    这个问题在这里已经有答案了 假设我有一个像这样的字符串 s PleaseAddSpacesBetweenTheseWords 如何在 R 中使用 gsub 在单词之间添加空格 以便我得到 Please Add Spaces Between
  • Android AdRequest 仅返回 onAdFailedToLoad AdRequest.ERROR_CODE_NO_FILL

    我的应用程序已经在 Google Play 商店上架一个月了 一切正常 两天前 我将其添加到 专为家庭设计 类别中 我收到了 Google 团队的接受和祝贺 从那时起 我的插页式广告就不再显示了 我收到AdRequest ERROR COD
  • 更改“选择”突出显示颜色[重复]

    这个问题在这里已经有答案了 我有一个自定义的下拉菜单框 见图 我想更改选项上的突出显示颜色以摆脱可怕的蓝色并将其更改为我选择的颜色 我还想停止周围的蓝色突出显示框整个事情并从选项框中删除边框 我该如何删除其中的任何一个或全部 Thanks
  • 如何使用 Swift 以编程方式更改语言环境

    我正在通过 Swift 在 XCODE 6 3 上制作 ios 应用程序 我的应用程序将具有选择语言功能 如下图所示 我已经有了本地语言的故事板 但我不知道如何通过按钮以编程方式更改应用程序的本地化 任何人都知道该怎么做 下面是使用 Swi
  • RDF图蕴涵

    我刚刚读到了 RDF 资源描述框架 的蕴涵概念 任何人都可以告诉我两个 RDF 图的蕴涵示例并对其进行一些解释 Thanks 假设您有以下内容 ex book1 rdf type ex Publication ex book2 rdf ty
  • 如何查找分组的 SQL 中位数

    我正在使用 SQL Server 2008 如果我有一个这样的表 Code Value 4 240 4 299 4 210 2 NULL 2 3 6 30 6 80 6 10 4 240 2 30 请问如何通过代码列找到中位数 AND 组
  • 警告:未知转义序列:'\040' [默认启用]

    我正在用 C 语言编写一个简单的应用程序 我想在 BSD 许可证下发布它 应用程序的一部分负责向用户打印有关程序的信息 但是 我在打印许可证文本时遇到问题 这是例子 include
  • 为什么并发字典没有可见的 Add() 方法?

    我只是想知道 ConcurrentDictionary 怎么可能没有 Visual Studio IDE 中可见的 Add 方法 我似乎只得到 TryX 方法 例如 TryAdd TryUpdate 等 我可以看到ConcurrentDic
  • 如何在两个以上的UIView之间做翻转动画?

    我在扩展 UIView 的类中有动画代码 Start Animation Block CGContextRef context UIGraphicsGetCurrentContext UIView beginAnimations nil c
  • Spring+Hibernate 中的@Transactional

    我正在使用春季 3 1 休眠 4 x在我的网络应用程序中 在我的 DAO 中 我保存用户类型对象如下 sessionFactory getCurrentSession save user 但出现以下异常 org hibernate Hibe
  • 向 CGPoint 类型参数发送 nil

    假设我有这个方法 void placeView UIView theView withCenterIn CGPoint centerPoint 所以我传递了视图和一个指向视图中心的点 但碰巧我不需要指定中心 只需要指定视图 传递 nil 会
  • 需要一个正则表达式工具来根据所选文本建议表达式[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我发现了一些在线工具 可以让我查看我在示例文本上创建的正则表达式的效果 但我正在寻找一种可以根据所选文本的一部分提出表达式建议的工具 例如 假设我有
  • 该IP、站点或移动应用程序无权使用该IP授权的API密钥

    我正在使用 Google Places API 它要求您提供允许使用该服务的 IP 列表 该 API 在我的本地计算机上运行良好 但它给出了 该IP 网站或移动应用程序无权使用该API 钥匙 当我从生产服务器使用它时 我已经添加了所需的 I
  • 具有相同签名的两个方法的互斥约束

    所以这两个方法具有相同的签名但不同的约束 public static void Method
  • 有开放的 iCalender API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何 API 可供我使用并将事件数据发布到 例如使用查询字符串 并取回访问者可以下载并添加到其日历中的文件 我当然可以自己编写脚本 但如果有开
  • 程序化短信[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 以编程方式发送短信的最佳方式是什么 是否有基于免费 Web 服务的 SMS 网关 我知道如果我碰巧知道用户的运营商 Sprint AT T 等 我可以发送通过电子邮件地址发送短信
  • Android 中的 RxJava 异步任务

    我正在尝试在 Android 中使用 RxJava 实现异步任务 我尝试了以下代码 但没有成功 它在 UI 线程上执行 我正在使用以下版本的 RxAndroid 0 24 0 try Observable just someMethodWh