我是从Android的角度来问这个问题,但这通常适用于RxJava。
作为一种最佳做法,我的观点是否应该处理即使是短暂的Completable
,Single
,Maybe
以及终止{em}应1}} Rx类型> 在短时间内终止,但在用户关闭视图时仍然可以执行?我知道当Rx链终止时,它会被丢弃,但这可能会在视图关闭后的某个时候发生。
例如,正在执行HTTP GET的Observable
。调用将完成,但可能是在视图被破坏后,暂时阻止垃圾回收。
如果在长期存在的视图中使用Single
来收集此类CompositeDisposable
,我认为应该注意Disposable
或以其他方式删除这些clear()
Disposable
定期防止CompositeDisposable
答案 0 :(得分:10)
作为一种最佳实践,我的观点应该始终处理即使是短暂的可完成,单一,可能和终止可观察的Rx类型
如果您与其他人分享代码,作为最佳做法,我会说是的,您应该弃置。虽然它可能看起来像是额外的锅炉板,但它会阻止下一个开发人员尝试挂钩您的订阅代码并尝试访问可能不再存在的组件(即Context
之后的Fragment
超然......等等。
如果使用CompositeDisposable在长期视图中收集此类Disposables,我会认为应该注意清除()或以其他方式定期删除这些Disposables以防止CompositeDisposable的大小无限增长?
我想指出在rxjava2中,CompositeDisposable
有一个状态;致电dispose()
后,任何后续添加的Disposable
将立即被处理掉。所以作为最佳实践:
CompositeDisposable
(onCreate(...)
等)dispose()
中处理onDestroy(...)
,因为到那时你的回调几乎没有任何价值,只是持有资源。 答案 1 :(得分:3)
将CompositeDisposable
置于onPause
或onDestroy
以避免此类问题是一种很好的做法。
答案 2 :(得分:0)
// 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();
在clear
中呼叫onResume
在dispose
中使用onDestroy
答案 3 :(得分: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'