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

标签 android rx-java rx-java2

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

1) 创建一条将要发送的消息(保存到数据库)
2) 向用户显示消息(状态“正在发送”)
3)发送消息到服务器(代码 fragment 如下)
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 (即 fragment )。但是,在这种情况下,我需要继续运行此任务,以确保本地数据库相应地更新为任务结果。

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

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

最佳答案

一旦他不再对Disposable感兴趣,他就会处理掉它。

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

这将导致您的 Activity 无法被垃圾回收,因为您的 Subscription 隐式引用了它,从而导致内存泄漏情况。

如果您有这样的用例,我认为您必须在组件上执行该请求,该请求将独立于 Activity 生命周期,例如 Service .

关于android - 使用 RxJava 处理长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545272/

相关文章:

java - 单击切换开关后 MapView 未返回正常状态

android - RxScala/Java - 为什么我的 progressBar 没有显示?

java - 当返回自定义对象列表时,RxJava 突出显示错误但编译

java - Android 蓝牙 ConnectThread 示例错误?

android - 页面加载时出现白屏 - 仅限 Android

rx-java - RxJava 缓冲区直到更改

android - RxJava - 如何查看 Flowable 和背压的作用?

android - RxJava 的 retryWhen 运算符

android - 在 eclipse 中为 android 配置 linux 上的 maven

android - RXJava - 拆分和合并 Observable