使用 RxJava 处理长时间运行的任务

2024-01-23

我正在尝试迁移AsyncTask向服务器发送消息,使用 RxJava。粗略地说,该任务执行以下操作:

1)创建一条将要发送的消息(保存到数据库)
2) 向用户显示消息(状态“正在发送”)
3)向服务器发送消息(代码片段如下)
4) 将消息标记为已发送或失败(保存到数据库)
5)更新用户界面

我已经创建了所需的 Rx 链,部分如下所示:

 public Observable<Message> sendMessage(Message message) {
     return mApiClient.sendMessage(message)
         .doOnNext(sentMessage -> mDatabase.synchroniseMessage(sentMessage))
         .doOnError(e -> {
             message.setState(FAILED);
             mDatabase.synchroniseMessage(message));
         })
         .onErrorReturn(e -> Observable.just(message));

当我订阅上述内容时,我会得到一个Disposable。通常我会把它添加到CompositeDisposable对象和clear该对象然后用户已移动到不同的view (i.e. fragment)。但是,在这种情况下,我需要继续运行此任务,以确保本地数据库相应地更新为任务结果。

处理这种情况最合适的方法是什么?我根本无法添加Disposable进入我的CompositeDisposable对象,因此不会取消订阅,但感觉它可能会导致问题。

附:向用户显示更新是通过观察 SQLite 表中的数据来处理的。这些事件是由synchroniseMessage方法。这是一个不同的订阅,我将简单地取消订阅,所以这不是问题的一部分。


一个处置Disposable一旦他不再对此感兴趣。

在您的情况下,无论用户是否导航到另一个屏幕,您仍然对流感兴趣,这意味着您无法取消订阅。这意味着您无法将其添加到CompositeDisposable.

这将导致一种情况,当你Activity无法被垃圾收集,因为您的隐式引用Subscription,因此您正在创建内存泄漏情况。

如果您有这样的用例,我认为您必须在组件上执行该请求,该组件将独立于活动生命周期,例如Service https://developer.android.com/guide/components/services.html.

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

使用 RxJava 处理长时间运行的任务 的相关文章

  • 键入时将编辑文本中的每个单词大写

    我想在打字时将编辑文本中的每个单词大写 My XML
  • 无法解析符号“AndroidJUnit4”

    显然我需要正确的导入语句来解决这个问题 根据文档用于AndroidJUnit4 http developer android com reference android support test runner AndroidJUnit4 h
  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • 按大小、日期、名称等在回收器视图中排序并记住选择

    我正在制作图库应用程序 我想为其添加排序功能 我可以使用以下命令在运行时对项目进行排序Comparator但问题是 每当我退出应用程序时 列表都会再次从数据库中出来 并且所有列表都未排序 我想在我的应用程序中提供按日期 大小 名称等排序的选
  • 更改 Android Spinner 布局/设计

    我正在尝试修改设计Spinner http developer android com intl de reference android widget Spinner html小部件 我可以更改背景 但找不到更改右侧箭头图标的方法 有办法
  • 启动时的 Android pin 活动

    我有一个应用程序 它将自身注册为默认启动器 并在启动时自动固定自身 安装应用程序时这一切都正常 它会自行固定 并且只有后退按钮可见 问题是 当设备首次启动时 它无法正确固定 我多次看到一系列 屏幕固定 和 屏幕取消固定 的 toast 主页
  • 从 ios 和 android 端连接到 xmpp 时获取所有群组消息

    我在用开放火版本 4 0 1 使用开火Rest Api https github com gidkom php openfire restapi我在服务 servicename xx xx xxx xxx 中创建了群聊室 现在房间已创建 发
  • Android TableRow 垂直拉伸以填充屏幕

    我正在尝试创建一个电话拨号器视图 使用 TableLayout 在 3x4 网格中创建 12 个按钮 我希望行垂直拉伸以平等地使用所有可用空间 但似乎 fill parent 在 TableRows 上不起作用 我不想使用 setMinim
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 安卓市场。 Google Checkout 和银行帐户

    请原谅 这不是一个编程问题 但它仍然与软件开发有关 所以我希望它没问题 为付费应用创建 Android 开发者帐户意味着注册一个 GoogleCheckout 帐户 这又意味着将其链接到来自这 31 个符合条件的国家 地区之一的银行帐户 有
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • Android:多图像密度支持 - 缩放高度宽度和 dpi?

    我有一个 Android 应用程序 我正在尝试添加对不同密度 屏幕尺寸等的支持 我已经在具有 HVGA 支持的模拟器上开发了该应用程序 并使用了我们 iphone 应用程序中的所有图标 自从分辨率以来 结果很好分辨率为 320x480 现在
  • 使用 Asp.Net 的 GCM 推送通知

    正如您可能已经看到的 Google 正在迁移其推送通知系统 http developer android com guide google gcm c2dm html http developer android com guide goo
  • 将样式应用于警报对话框

    我决定尝试材质警报dialogs https material io develop android components dialog 在安卓上 我遇到的问题是当我尝试应用某些样式时 检查文档 我发现了这个
  • getViewByID 对于 Listview 返回 null

    我的 main xml 如下
  • ProGuard 与 Android:java.lang.NoSuchMethodError:android.util.Xml.asAttributeSet

    当 ProGuard 被禁用时 我的应用程序运行正常 启用ProGuard后 应用程序将导出为apk并安装到模拟器中 然后当我在模拟器中运行它时 强制关闭 05 10 11 14 10 582 E AndroidRuntime 759 FA
  • Android:如何为我的应用程序播放的任何音乐文件创建淡入/淡出音效?

    我正在开发的应用程序播放音乐文件 如果计时器到期 我希望音乐淡出 我怎么做 我正在使用 MediaPlayer 播放音乐 音乐文件位于我的应用程序的原始文件夹中 这是我的 Android MediaPlayer 的整个处理程序类 查看 pl
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • 无法读取解析推送通知包数据

    我尝试使用 Parse 推送通知服务发送自定义数据 但从 Bundle 中提取时总是返回 null 值 自定义广播接收器 Override public void onReceive Context context Intent inten
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr

随机推荐

  • p:dataTable 中的 h:selectOneMenu 未提交其值

    我有关于 selectOneMenu 和设置值的问题 我有一张对象示例光盘 其中包含 ID 文本和List
  • 在 C# Windows 窗体中预览 .doc、.docx [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在用 C 开发一个 Windows 窗体项目 现在我可以使用 ToolBox 中的 WebBrow
  • 如何比较车把中的值?

    我想根据条件显示不同的 HTML 它似乎没有比较这两个值 并且总是显示第一个变体 如何将预定义值与 JSON 中的原始值进行比较 以便它可以正确执行 each this each visits div class row if variab
  • 带参数的 Jest Mock Promise

    这是我尝试在 Jest 中编写单元测试的方法 async function getParameter parameter string withDecryption boolean false Promise
  • Jquery,拖放并保存到mysql数据库?

    我在网上找了好久 只找到了inetuts with cookies 它教如何使用Jquery进行拖放 然后保存在cookie中 谁能告诉我如何保存到数据库 php 和 mysql 我非常需要它 EDIT 首先 我不是php初学者 而是AJA
  • 预验证类中的 java.lang.IllegalAccessError 类引用解析为意外实现

    当我按下启动 MainActivity 中应该启动新活动的方法的按钮时 出现 预验证类中的 java lang IllegalAccessError 类引用解析为意外实现 错误 我可以做什么来解决这个问题 这是我第一次尝试制作 Androi
  • Nativescript ios - 命令 xcodebuild 失败,退出代码为 null

    我通过运行以下命令设置了一个新的 nativescript 应用程序 tns create application ng 当我尝试使用以下方式启动应用程序时 tns run ios emulator 我收到以下错误 Unable to ap
  • 检测菜单项单击上的鼠标左键/右键吗?

    在Delphi XE2中 如何检测用户是否用鼠标左键或右键单击了弹出菜单项 使用该单元 将其作为组件安装并替换标准TPopupMenu这增加了一个OnMenuRightClick event unit RCPopupMenu interfa
  • 如何在使用 iframe 时停止 IE 11 上的自动下载

    我已经在 Iframe 标记中给出了源 我的问题是 当页面在 IE 上加载时 下载会自动开始 并且通常发生在 Windows 8 上安装的 IE 上 div div 下载可能是因为没有Adobe Reader插件 安装 在这种情况下 IE
  • 在 SoundCloud iOS 应用程序中打开曲目的 URL

    我想在 SoundCloud iOS 应用程序中打开 SoundCloud 曲目 我的印象是使用正确的 url 方案是soundcloud track track id 这将打开 SoundCloud 应用程序 但不会选择正确的曲目 任何人
  • 无法在 Python 3.10 上安装 Matplotlib

    python3 10 m pip install user matplotlib 当我运行上面的命令来安装 Matplotlib 时 我不断收到以下错误 我最初遇到 C 错误 然后我安装了 Visual Studio Time Elapse
  • 任何像 recyclerview 或 javafx 的可重用视图之类的东西

    我正在创建一个滚动窗格 它显示从 sqlite 数据库获取的数据集 这些数据以这样的方式显示 即它们排列在重复的 ui 集中 就像在 android 中的 recyclerview 中一样 有什么方法可以实现它 因为使用 javafx 定位
  • 如何阻止 Exchange 自动将纯文本电子邮件转换为 HTML?

    我已经为将由我的代码解析的电子邮件设置了一个 Exchange 2003 邮箱 电子邮件以纯文本形式发送 我的代码希望以纯文本形式接收它们 但是 Exchange 似乎会自动将它们转换为 HTML 我如何阻止它这样做并只按照发送的方式接收电
  • 在 pandas 中使用元组作为索引键时,如何“通过传入类别参数显式指定类别顺序”?

    我一直在试图弄清楚如何使这些元组索引键pandas但我收到错误 我如何使用错误中的建议pd Categorical下面修复这个错误 我知道我可以转换为字符串 但我很好奇错误消息中的建议是什么意思 当我运行它时 效果非常好0 22 0 我已经
  • emberjs:如何在视图中触发自定义事件

    我想将原始事件 单击 转换为语义事件 例如 deleteTodo 这是描述的here http emberjs com guides views 但不知道如何实施 我有以下代码 App TodoView Em View extend cli
  • 在编译时进行字符串驻留以进行分析

    Context 我正在开发一个仪器分析器 它使您能够通过字符串命名不同的测量结果 例如 MEASURE SCOPE text rendering code MEASURE SCOPE password hashing MEASURE STA
  • 使用 jQuery 获取 单元格的“坐标”

    我正在构建一个不同的网站 下面是我的 HTML 标记和我的问题 请不要被这堵文字吓倒 我确信对于那些知道自己的东西的人来说这确实不是一个难题 但需要一些解释 div class cell table border 0 cellpadding
  • 当 HEALTHCHECK 失败时 Docker 容器会发生什么

    码头工人docs https docs docker com engine reference builder healthcheck说什么HEALTHCHECK说明是如何检查容器的健康状况 但我无法弄清楚健康检查失败时会发生什么 就像按照
  • MySQL复制用户

    我想在我的 MySQL 测试数据库上创建两个用户 一个对与生成报告等相关的表具有只读访问权限 另一个对同一表具有读写访问权限 这是为了测试通常与只读用户连接但切换到读写用户以执行某些任务的子系统 我已经创建了具有正确权限的读写用户 现在我需
  • 使用 RxJava 处理长时间运行的任务

    我正在尝试迁移AsyncTask向服务器发送消息 使用 RxJava 粗略地说 该任务执行以下操作 1 创建一条将要发送的消息 保存到数据库 2 向用户显示消息 状态 正在发送 3 向服务器发送消息 代码片段如下 4 将消息标记为已发送或失