基于LifeOwner的RxJava內(nèi)存泄漏解決方案

組件設(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ì)于依托于ActivityView來(lái)說(shuō),其Context就是Activity(AppCompatActivity),所以這里直接做了強(qiáng)轉(zhuǎn)。

viewcontext一定是Activity嗎? 可以看這篇文章了解一下:

View.getContext()一定會(huì)返回 Activity 對(duì)象么?

即在5.0以上的系統(tǒng)上返回的就是Avctivity,即LifeOwner,所以對(duì)于這個(gè)強(qiáng)轉(zhuǎn)還是需要注意的。

PS: 目前我們的項(xiàng)目minSdkVersion21。如果不是的話(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。

不支持

不支持在ServiceBroadcastReceiverContentProvider中使用,因?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ù)

組合GlobalRxDisposeManagerDestroyLifeCycleObserver并簡(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
}

源碼 : RxLifeCycleExtensions

原文鏈接 : Android進(jìn)階-基于LifeOwner的RxJava內(nèi)存泄漏解決方案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容