我尝试迁移向服务器发送消息的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
方法触发。这是一个不同的订阅,我只是取消订阅,所以它不是问题的一部分。
答案 0 :(得分:2)
一旦他不再感兴趣,就会处置Disposable
。
在您的情况下,无论用户导航到另一个屏幕还是否,您仍然对该流感兴趣,这意味着您无法取消订阅。这意味着您无法将其添加到CompositeDisposable
。
这会导致这样的情况,即Activity
无法进行垃圾回收,因为Subscription
隐式引用它,因此您正在创建内存泄漏情况。
如果您有这样一个用例,我认为您必须在一个组件上执行该请求,该组件与活动生命周期无关,如Service
。