組件設(shè)計(jì)思路:
通過(guò)觀察LifeOwner(Activity)的LifeCycle Event,在ActivityonDestroy時(shí)釋放掉其所有的Disposable
了解
LifeOwner可以看一下這篇文章: Android Architecture Components 組件介紹
使用方法:
在Activity與Fragment中
RxBus
.toObservable(SynEvent::class.java)
.subscribe {
...
}
.disposeOnDestroy(this)
項(xiàng)目中所有的Activity都是繼承自AppCompatActivity。AppCompatActivity本身就是一個(gè)LifeOwner。
對(duì)于Fragment,其本身也是LifeOwner對(duì)象,使用方式同上。
在View中
RxBus
.toObservable(SynEvent::class.java)
.subscribe {
...
}
.disposeOnDestroy(context as AppCompatActivity)
對(duì)于依托于Activity的View來(lái)說(shuō),其Context就是Activity(AppCompatActivity),所以這里直接做了強(qiáng)轉(zhuǎn)。
那view的context一定是Activity嗎? 可以看這篇文章了解一下:
View.getContext()一定會(huì)返回 Activity 對(duì)象么?
即在5.0以上的系統(tǒng)上返回的就是Avctivity,即LifeOwner,所以對(duì)于這個(gè)強(qiáng)轉(zhuǎn)還是需要注意的。
PS: 目前我們的項(xiàng)目
minSdkVersion是21。如果不是的話(huà)不能這樣使用。
在Presenter中
RxBus
.toObservable(SynEvent::class.java)
.subscribe {
...
}
.disposeOnDestroy(view.lifeContext())
由于我們項(xiàng)目中所有MVP中的View都繼承自下面接口:
interface BaseLifeCycleView {
fun lifeContext(): AppCompatActivity
}
所以上面view.lifeContext()就是LifeOwner。
在Application中
RxBus
.toObservable(SynEvent::class.java)
.subscribe {
...
}
.disposeOnDestroy(ProcessLifecycleOwner.get())
ProcessLifecycleOwner也是Android Architecture Components中的組件,它可以用來(lái)觀察整個(gè)app的生命周期。
disposeOnStop 擴(kuò)展函數(shù)
使用方式與disposeOnDestroy相同,不同的是會(huì)在OnStop時(shí)釋放掉所有的Disposable。
不支持
不支持在Service、BroadcastReceiver和ContentProvider中使用,因?yàn)樗麄儾⒉皇?code>LifeOwner。不過(guò)可以簡(jiǎn)單繼承一下,然后自己改造成LifeOwner。
實(shí)現(xiàn)原理
實(shí)現(xiàn)原理很簡(jiǎn)單:
一個(gè)LifeOwner對(duì)象創(chuàng)建一個(gè)LifeObserver,它持有著LifeOwner的所有Disposable。在LifeOwner的Lifecycle.Event.ON_DESTROY時(shí),釋放LifeOwner的所有Disposable
主要有2個(gè)組件:
DestroyLifeCycleObserver
它是一個(gè)LifecycleObserver,持有LifecycleOwner并負(fù)責(zé)其所有的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()
}
GlobalRxDisposeManager
主要負(fù)責(zé)維護(hù)所有的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}")
}
...
}
}
...
}
disposeOnDestroy擴(kuò)展函數(shù)
組合GlobalRxDisposeManager與DestroyLifeCycleObserver并簡(jiǎn)化使用:
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
}