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

时间:2017-04-21 14:30:16

标签: android rx-java rx-java2

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

1)创建将被发送的消息(持久存储到数据库中)
2)向用户显示消息(状态'发送')
3)将消息发送到服务器(下面的代码片段)
4)将消息标记为已发送或已失败(持续存储到数据库)
5)更新UI

我已经创建了所需的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对象中,因此它不会取消订阅,但感觉它可能会导致问题。

P.S。通过观察SQLite表中的数据来处理显示用户的更新。这些事件由synchroniseMessage方法触发。这是一个不同的订阅,我只是取消订阅,所以它不是问题的一部分。

1 个答案:

答案 0 :(得分:2)

一旦他不再感兴趣,就会处置Disposable

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

这会导致这样的情况,即Activity无法进行垃圾回收,因为Subscription隐式引用它,因此您正在创建内存泄漏情况。

如果您有这样一个用例,我认为您必须在一个组件上执行该请求,该组件与活动生命周期无关,如Service