我正在尝试将一个向服务器发送消息的异步任务迁移到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));
当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposable对象中,然后清除该对象,然后用户移动到不同的视图(即片段)。但是,在这种情况下,我需要继续运行此任务,以确保本地数据库使用相应的任务结果进行更新。
处理这种情况的最合适方法是什么?我无法简单地将Disposable
添加到我的CompositeDisposable
对象中,因此它不会被取消订阅,但感觉它可能会导致问题。
附言。向用户显示更新是通过观察SQLite表中的数据来处理的。这些事件是由syniseMessage
方法触发的。这是一个不同的订阅,我将简单地取消订阅,所以这不是问题的一部分。
一旦他不再对Disposable
感兴趣,就会处理掉它。
在您的情况下,无论用户是否导航到另一个屏幕,您仍然对该流感兴趣,这意味着您无法取消订阅。这意味着您无法将其添加到CompositeDisposable。
这将导致一种情况,当您的活动
无法被垃圾收集时,因为您的订阅
隐式引用了它,因此您正在创建内存泄漏情况。
如果您有这样一个用例,我认为您必须对一个组件执行该请求,该组件将独立于活动生命周期,如服务。
我正在使用rxjava将一些任务上载到服务器,每当任务启动的片段或活动被销毁时,我都会处理订阅以避免内存泄漏,但我想要的是,即使在片段/活动被销毁后,我也需要继续在后台运行任务,有什么方法可以实现这一点吗? 实例 是否必须始终释放订阅?如果不是,何时使用dispose?
Android系统如何处理长时间运行的后台任务?开发人员能否依赖系统保持活动的未绑定服务?
我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,
问题内容: 我有一个用JAX- RS实现的REST服务。有些操作需要很长时间才能完成,可能需要15到30分钟。对于这些情况,我倾向于派遣一个后台线程来处理长时间运行的操作,然后立即以HTTP状态202 ACCEPTED进行响应。响应将包含一个带有URL的位置标头,客户端可使用该标头来轮询进度。 这种方法需要创建线程来处理长时间运行的操作,以便可以立即返回202 ACCEPTED。我也知道在Java
问题内容: 我有一个python celery-redis队列处理一次上传和下载值得一次演出和大量演出的数据。 很少有上传内容需要花费几个小时的时间。但是,一旦完成了这样的任务,我就目睹了这种奇怪的芹菜行为:芹菜调度程序通过将其再次发送给工作人员来重新运行刚刚完成的任务(我正在运行一个工作人员),并且它在同一时间发生了2次任务! 有人可以帮助我知道为什么会发生这种情况以及如何预防吗? 这些任务肯定
我们有一个不稳定的旧单块系统,95%的请求在500毫秒内处理,但其他5%需要 我们当前的方法是使用具有指数回退重试机制的异步http客户端。但随着流量的增加,这将导致性能问题 我的想法是在S中有一个超时500毫秒的同步超文本传输协议调用和一个回退方法,该方法将一个任务添加到队列中,以便将来重试超文本传输协议请求,同时将202返回给C,并返回一个链接来检查任务的状态,类似于。我知道我需要将S公开的服