最近了解到一个开源库,uber的 AutoDispose,由于不经常使用RxJava,竟然不知道还有这么个东西。。它的主要作用就是在Activity或View销毁不可用的时候自动取消RxJava的订阅,也就是常用的Disposable切断管道流, 取消订阅,避免内存泄漏。AutoDispose将之前的Disposable.dispose()操作做了封装,可以自动处理。
它的使用就不去详细探索了,搜索一下就有一堆,这里主要探究一下AutoDispose的实现原理的关键技术点,既然它能在AC销毁的时候自动取消,那么它是如何自动感知AC的生命周期的呢?
AutoDispose的简单用法示例:
Observable.interval(1, TimeUnit.SECONDS)
.doOnDispose(new Action() {
@Override public void run() throws Exception {
Log.i(TAG, "Disposing subscription from onResume() with untilEvent ON_DESTROY");
}
})
.as(AutoDispose.<Long>autoDisposable(
AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY)))//OnDestory时自动解绑
.subscribe(new Consumer<Long>() {
@Override public void accept(Long num) throws Exception {
Log.i(TAG, "Started in onResume(), running until in onDestroy(): " + num);
}
});
其中as返回的还是一个Observable对象,关键是这一行:
AutoDispose.autoDisposable(
AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY))
AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY) 中的this是什么:
这个this实际上是LifecycleOwner这个接口,LifecycleOwner又是神马?
是android提供的Lifecycle
这个组件库中的一个接口,同时还有一个LifecycleObserver
观察者接口,通过源码发现,support.v7
包中的AppCompatActivity
最终继承自SupportActivity
,SupportActivity
实现了LifecycleOwner
接口,support.v4
包中的Fragment
也实现了LifecycleOwner
接口。AndroidX的ComponentActivity
支持库同样也实现了LifecycleOwner
接口:
所以这些类当中默认都能直接使用 AutoDispose ,那具体的生命周期检测是如何做到的?
先看LifecycleObserver
这个接口的简单使用代码:
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver