在RxJava中处理Completable、Single、Maybe和终止的Observables的最佳实践

29
我从Android的角度提出这个问题,但是它适用于RxJava总体。作为最佳实践,即使是短暂存在的Completable、Single、Maybe和终止的Observable Rx类型,也应该总是在视图关闭时处理,以确保其在短时间内终止,即使当用户关闭视图时仍可能执行。我知道当Rx链结束时,它会被处理,但这可能会发生在视图关闭之后。例如,在执行HTTP GET的Single中,调用将完成,但它可能是在视图销毁之后完成的,暂时阻止了垃圾回收。如果在长期存在的视图中使用CompositeDisposable来收集这些一次性对象,则应该小心地定期清除或删除这些对象,以防止CompositeDisposable的大小无限增长。

1
很想看到如何处理“Completable”的答案,似乎下面没有涉及到。 - Andrea Thacker
4个回答

12
作为最佳实践,即使是短暂的 Completable、Single、Maybe 和终止的 Observable Rx 类型,我的视图是否应始终处理?如果你要与他人共享代码,作为最佳实践,我会说“是的,你应该清理。”尽管它可能看起来像额外的样板,但它将防止下一个开发人员尝试钩入您的订阅代码并尝试访问可能不再存在的组件(例如,在Fragment被分离后的Context之后等)。
如果使用 CompositeDisposable 来收集这些 Disposables,则应注意定期清除() 或以其他方式删除这些 Disposables,以防止 CompositeDisposable 大小无限增长。我想指出,在 rxjava2 中,CompositeDisposable 有一个状态;一旦调用 dispose(),任何随后添加的 Disposable 都将立即被处理。因此,作为最佳实践:
1. 在生命周期的开始处(例如 onCreate(...) 等)创建一个新的 CompositeDisposable。 2. 在 onDestroy(...) 中处理 dispose(),因为到那时,回调实际上已经没有价值,只是在占用资源。

只是一个想法:我不知道是否有人尝试使用较新的Android架构生命周期组件来制作生命周期感知的复合一次性组件。 - Jon
AutoDispose看起来不错,唯一的问题是我无法在支持Fragment中使用它。有人有可行的示例吗? - Gavriel

5

在使用CompositeDisposable时,为了避免出现问题,最好在onPause或者onDestroy中将其处理掉。


2
// Using clear will clear all, but can accept new disposable
disposables.clear(); 
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose(); 

onResume中调用clear

onDestroy中使用dispose


0
我也遇到了类似的问题,有时任务可以被处理,但有时却不能,这会导致应用程序随机崩溃。然而,在我更新rxJava/Rxandroid版本后,一切都正常工作了。
原始Rx版本:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'

然后升级到

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接