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

时间:2017-09-27 20:18:38

标签: android rx-java dispose rx-java2

我是从Android的角度来问这个问题,但这通常适用于RxJava。

作为一种最佳做法,我的观点是否应该处理即使是短暂的CompletableSingleMaybe以及终止{em}应 在短时间内终止,但在用户关闭视图时仍然可以执行?我知道当Rx链终止时,它会被丢弃,但这可能会在视图关闭后的某个时候发生。

例如,正在执行HTTP GET的Observable。调用将完成,但可能是在视图被破坏后,暂时阻止垃圾回收。

如果在长期存在的视图中使用Single来收集此类CompositeDisposable,我认为应该注意Disposable或以其他方式删除这些clear() Disposable定期防止CompositeDisposable

的大小无限增长

4 个答案:

答案 0 :(得分:10)

  

作为一种最佳实践,我的观点应该始终处理即使是短暂的可完成,单一,可能和终止可观察的Rx类型

如果您与其他人分享代码,作为最佳做法,我会说是的,您应该弃置。虽然它可能看起来像是额外的锅炉板,但它会阻止下一个开发人员尝试挂钩您的订阅代码并尝试访问可能不再存在的组件(即Context之后的Fragment超然......等等。

  

如果使用CompositeDisposable在长期视图中收集此类Disposables,我会认为应该注意清除()或以其他方式定期删除这些Disposables以防止CompositeDisposable的大小无限增长?

我想指出在rxjava2中,CompositeDisposable有一个状态;致电dispose()后,任何后续添加的Disposable将立即被处理掉。所以作为最佳实践:

  1. 在生命周期开始时创建一个新的CompositeDisposableonCreate(...)等)
  2. dispose()中处理onDestroy(...),因为到那时你的回调几乎没有任何价值,只是持有资源。

答案 1 :(得分:3)

CompositeDisposable置于onPauseonDestroy以避免此类问题是一种很好的做法。

答案 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'