基于LifeOwner的RxJava内存泄漏处理方案

作者 : 开心源码 本文共3388个字,预计阅读时间需要9分钟 发布时间: 2022-05-13 共246人阅读

组件设计思路:

通过观察LifeOwner(Activity)LifeCycle Event,在ActivityonDestroy时释放掉其所有的Disposable

理解LifeOwner可以看一下这篇文章: Android Architecture Components 组件详情

使用方法:

在Activity与Fragment中

RxBus    .toObservable(SynEvent::class.java)    .subscribe {      ...    }    .disposeOnDestroy(this)

项目中所有的Activity都是继承自AppCompatActivityAppCompatActivity本身就是一个LifeOwner

对于Fragment,其本身也是LifeOwner对象,使用方式同上。

在View中

RxBus    .toObservable(SynEvent::class.java)    .subscribe {      ...    }    .disposeOnDestroy(context as AppCompatActivity)

对于依托于ActivityView来说,其Context就是Activity(AppCompatActivity),所以这里直接做了强转。

viewcontext肯定是Activity吗? 可以看这篇文章理解一下:

View.getContext()肯定会返回 Activity 对象么?

即在5.0以上的系统上返回的就是Avctivity,即LifeOwner,所以对于这个强转还是需要注意的。

PS: 目前我们的项目minSdkVersion21。假如不是的话不能这样使用。

在Presenter中

RxBus    .toObservable(SynEvent::class.java)    .subscribe {      ...    }    .disposeOnDestroy(view.lifeContext())

因为我们项目中所有MVP中的View都继承自下面接口:

interface BaseLifeCycleView {    fun lifeContext(): AppCompatActivity}

所以上面view.lifeContext()就是LifeOwner

在Application中

RxBus    .toObservable(SynEvent::class.java)    .subscribe {      ...    }    .disposeOnDestroy(ProcessLifecycleOwner.get())

ProcessLifecycleOwner也是Android Architecture Components中的组件,它可以用来观察整个app的生命周期。

disposeOnStop 扩展函数

使用方式与disposeOnDestroy相同,不同的是会在OnStop时释放掉所有的Disposable

不支持

不支持在ServiceBroadcastReceiverContentProvider中使用,由于他们并不是LifeOwner。不过可以简单继承一下,而后自己改造成LifeOwner

实现原理

实现原理很简单:

一个LifeOwner对象创立一个LifeObserver,它持有着LifeOwner的所有Disposable。在LifeOwner的Lifecycle.Event.ON_DESTROY时,释放LifeOwner的所有Disposable

主要有2个组件:

DestroyLifeCycleObserver

它是一个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()}

GlobalRxDisposeManager

主要负责维护所有的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扩展函数

组合GlobalRxDisposeManagerDestroyLifeCycleObserver并简化使用:

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内存泄漏处理方案

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 基于LifeOwner的RxJava内存泄漏处理方案

发表回复