组件设计思路:
通过观察LifeOwner(Activity)
的LifeCycle Event
,在ActivityonDestroy
时释放掉其所有的Disposable
理解
LifeOwner
可以看一下这篇文章: Android Architecture Components 组件详情
RxBus .toObservable(SynEvent::class.java) .subscribe { ... } .disposeOnDestroy(this)
项目中所有的Activity
都是继承自AppCompatActivity
。AppCompatActivity
本身就是一个LifeOwner
。
对于Fragment
,其本身也是LifeOwner
对象,使用方式同上。
RxBus .toObservable(SynEvent::class.java) .subscribe { ... } .disposeOnDestroy(context as AppCompatActivity)
对于依托于Activity
的View
来说,其Context
就是Activity(AppCompatActivity)
,所以这里直接做了强转。
那view
的context
肯定是Activity
吗? 可以看这篇文章理解一下:
View.getContext()肯定会返回 Activity 对象么?
即在5.0以上的系统上返回的就是Avctivity
,即LifeOwner
,所以对于这个强转还是需要注意的。
PS: 目前我们的项目
minSdkVersion
是21
。假如不是的话不能这样使用。
RxBus .toObservable(SynEvent::class.java) .subscribe { ... } .disposeOnDestroy(view.lifeContext())
因为我们项目中所有MVP中的View
都继承自下面接口:
interface BaseLifeCycleView { fun lifeContext(): AppCompatActivity}
所以上面view.lifeContext()
就是LifeOwner
。
RxBus .toObservable(SynEvent::class.java) .subscribe { ... } .disposeOnDestroy(ProcessLifecycleOwner.get())
ProcessLifecycleOwner
也是Android Architecture Components
中的组件,它可以用来观察整个app的生命周期。
使用方式与disposeOnDestroy
相同,不同的是会在OnStop
时释放掉所有的Disposable
。
不支持在Service
、BroadcastReceiver
和ContentProvider
中使用,由于他们并不是LifeOwner
。不过可以简单继承一下,而后自己改造成LifeOwner
。
实现原理很简单:
一个LifeOwner
对象创立一个LifeObserver
,它持有着LifeOwner
的所有Disposable
。在LifeOwner的Lifecycle.Event.ON_DESTROY
时,释放LifeOwner
的所有Disposable
主要有2个组件:
它是一个LifecycleObserver
,持有LifecycleOwner
并负责其所有的Disposable
的释放工作。
internal class DestroyLifeCycleObserver(val lifeOwner: LifecycleOwner) : LifecycleObserver { private val disposableList = ArrayList<Disposable>() var requestRemoveLifecycleObserver: RequestRemoveLifecycleObserver? = null init { lifeOwner.lifecycle.addObserver(this) } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { LogUtils.d(TAG, "${getKey()} OnLifecycleEvent ON_DESTROY , disposableList.size : ${disposableList.size}") disposableList.forEach { if (!it.isDisposed) { it.dispose() } } requestRemoveLifecycleObserver?.requestRemoveDestroyObserver(this) } fun addDisposable(disposable: Disposable) { if (disposable.isDisposed) return disposableList.add(disposable) } fun getKey() = lifeOwner.toString()}
主要负责维护所有的LifeCycleObserver, 以DestroyLifeCycleObserver
为例:
object GlobalRxDisposeManager { private val rxLifecycleObservers = HashMap<String, DestroyLifeCycleObserver?>() fun getLifecycleObserver(key: String): DestroyLifeCycleObserver? { return rxLifecycleObservers[key] } fun addLifecycleObserver(lifeCycleObserver: DestroyLifeCycleObserver) { rxLifecycleObservers[lifeCycleObserver.getKey()] = lifeCycleObserver lifeCycleObserver.requestRemoveLifecycleObserver = object : RequestRemoveLifecycleObserver { override fun requestRemoveDestroyObserver(observer: DestroyLifeCycleObserver) { destroyLifeCycleObserver.remove(observer.getKey()) LogUtils.d(TAG, "destroyLifeCycleObserver size : ${destroyLifeCycleObserver.size}") } ... } } ...}
组合GlobalRxDisposeManager
与DestroyLifeCycleObserver
并简化使用:
fun Disposable.disposeOnDestroy(lifeOwner: LifecycleOwner): Disposable { LogUtils.d(TAG, "life owner key : ${lifeOwner}") var lifecycleObserver = GlobalRxDisposeManager.getDestroyObserver(lifeOwner.toString()) if (lifecycleObserver == null) { lifecycleObserver = DestroyLifeCycleObserver(lifeOwner) GlobalRxDisposeManager.addDestroyObserver(lifecycleObserver) } lifecycleObserver.addDisposable(this) return this}
源码 : RxLifeCycleExtensions
原文链接 : Android进阶-基于LifeOwner的RxJava内存泄漏处理方案