yoo*_*hok 3 android kotlin rx-java
通常,我在“onStop/onDestroy”函数上调用“disposable.clear()”。
但是今天,我看到我的同事使用以下代码在 subscribe 函数中调用 clear 函数,例如:
val disposable: CompositeDisposable = CompositeDisposable()
...
disposable.add(
MyObservable()
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe {
// doSomething...
disposable.clear // My question is here.
}
)
Run Code Online (Sandbox Code Playgroud)
实际上,它看起来工作正常。但我不知道这段代码是否正确......
在 Android 中使用 RxJava 时,我通常在onDestroy. 处理它们是足够安全的,onDestroy因为即使onDestroy从未被调用,您也可以安全地假设系统已经杀死了您的应用程序进程或订阅了 Observable 的组件。
我从不处理订阅的原因onSuccessoronNext是因为例如,在Flowable...onNext可以多次发出的情况下,处理订阅是没有意义的。
事实上,我通常做的是将CompositeDisposablea包裹在里面,LifecycleObserver以便它可以根据生命周期感知组件自动进行垃圾收集。这是我经常使用的一个实现......
class AutoDisposable : LifecycleObserver{
lateinit var compositeDisposables: CompositeDisposable
/**
* Binds this observer to the specified life cycle object
*
* @param lifecycle The lifecycle object to bind to
*/
fun bindTo(lifecycle: Lifecycle){
lifecycle.addObserver(this)
compositeDisposables = CompositeDisposable()
}
/**
* Registers a disposable that will be disposed when the bound lifecycle object is destroyed
*
* @param disposable The disposable to register
*/
fun addDisposable(disposable: Disposable){
if(::compositeDisposables.isInitialized){
compositeDisposables.add(disposable)
}
else{
throw Exception("This object must be bound to a lifecycle before registering a disposable")
}
}
/**
* Disposes all registered disposables
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
compositeDisposables.dispose()
}
}
Run Code Online (Sandbox Code Playgroud)
然后在一个活动(或片段)上你所要做的就是......
class MyActivity : AppCompatActivity(){
private val autoDisposables: AutoDisposable =
AutoDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
autoDisposables.bindTo(lifecycle)
}
override fun onStart(){
autoDisposables.add(
MyObservable()
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe {
// handle onNext
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
然后您无需担心、清除或处置您的订阅。您甚至可以更进一步,创建一个基础活动或片段,负责绑定CompositeDisposable和公开protected函数以添加一次性物品...
//on a base activity
protected fun registerDisposable(disposable: Disposable){
autoDisposables.addDisposable(disposable)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4705 次 |
| 最近记录: |