gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:35:35 26 4
gpt4 key购买 nike

我正在尝试迁移一个向服务器发送消息的 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 对象并清除该对象然后用户移动到不同的 View (即 fragment )。但是,在这种情况下,我需要继续运行此任务以确保本地数据库相应地更新了任务结果。

处理这种情况最合适的方法是什么?我不能简单地将 Disposable 添加到我的 CompositeDisposable 对象中,因此它不会被取消订阅,但感觉它可能会导致问题。

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

最佳答案

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

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

这会导致这样一种情况,当您的 Activity 无法被垃圾回收时,因为您的 Subscription 对其进行了隐式引用,因此您正在造成内存泄漏情况。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com