RxLifecycle解决RxJava内存泄漏问题
RxLifecycle解决RxJava内存泄漏问题
一、RxJava使用问题
使用RxJava发布一个订阅后,当页面被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity/Fragment无法被回收,从而引发内存泄漏。
目前对RxJava的内存泄漏方法有两种:
1 . 通过封装,手动为RxJava的每次订阅进行控制,在指定的时机进行取消订阅。
2 . 使用Daniel Lew的RxLifecycle,通过监听Activity、Fragment的生命周期,来自动断开subscriptioni以防止内存泄漏。
二、RxLifecycle
用途:可以通过绑定生命周期的方式,来解决内存泄漏的问题。
在RxJava中使用compose操作符来绑定容器的生命周期,其中有两种方式:
1 . 使用bindToLifecycle()
以Activity为例子,bindToLifecycle()方法绑定Activity的生命周期,在Activity中使用bindToLifecycle()方法,完成Observable发布的事件和当前的Activity进行绑定,实现生命周期的同步,从而实现当前组件生命周期结束时,自动取消对Observable的订阅。
一个简单的例子如下:
上述例子中,将Observable发布的事件与mRootView这个Activity进行绑定,实现生命周期的同步。此处例子中使用了JessYan大神的MVP框架,因此是经过大神写的RxLifecycleUtils类进行了处理的。
完整的使用方式如下代码所示:
使用compose(this.bindToLifecycle())方法绑定Activity的生命周期,在onStart()方法中绑定,在onStop方法被调用后会自动解除绑定。
特殊情况:如果在onPause/onStop方法中绑定,那么就会在它的下一个生命周期(onStop/onDestory)被调用后解除绑定。
2 . 使用bindUnitEvent()
bindUnitEvent()方法指定在哪个生命周期方法调用时取消订阅。其中的CREATE、START、RESUME、PAUSE、STOP、DESTORY分别对应生命周期内的方法。
因此使用RxLifecycle完成在容器的 指定生命周期内,RxJava的自动取消订阅只需三步:依赖、继承以及compose操作符。
三、RxLifecycle原理分析
对RxLifecycle的原理有兴趣的同学可以查看“却把清梅嗅”博主的博客:解决RxJava内存泄漏(前篇):RxLifecycle详解及原理分析
最后有兴趣的同学可以了解一下同样是由Daniel Lew设计的解决RxJava内存泄漏问题的AutoDispose。
AutoDispose相比较于RxLeftcycle更加健硕,并且拥有更优秀的拓展性。具体可以参看“却把清梅嗅”博主的博客(其中对AutoDispose的原理有解析,在学习之前要先理解RxLeftcycle原理):Android架构中添加AutoDispose解决RxJava内存泄漏
资料参考:解决RxJava内存泄漏(前篇):RxLifecycle详解及原理分析
Android 使用RxLifecycle解决RxJava内存泄漏
Github官方地址:RxLifecycle的Github官方