RxJava 的内存泄露问题
runRxLambda 和 runRxLambdaViewModel 只是个扩展函数,能够不用理会,下面两段代码惟一的区别就是第二段增长了
AndroidLifecycleScopeProvider.from(view)
,这也致使了第二段代码不会出现内存泄露,而第一段代码会出现内存泄露。java
runRxLambda(Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ Log.e("222","runRxLambda-time:$it") },{ },{ }) // 只处理成功,失败的能够处理能够不处理 runRxLambdaViewModel(AndroidLifecycleScopeProvider.from(view),Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ Log.e("222","runRxLambdaViewModel-time:$it") mElapsedRealTime.postValue(it) })
下面的日志对应的操做流程是:跳转一个页面后点击一个按钮,执行上面的两段代码,而后当即返回上一个页面。android
经过日志也能够看出第一段代码内存泄露了吧,页面都已经关闭可是相关的逻辑代码还在执行。这就是 RxJava
使用中常见的内存泄露问题。git
解决方案
- 在 onSubscribe(d: Disposable) 回调中保存 dispose ,在页面关闭的时候调用
.dispose()
方法 - 使用
RxLifeCycle
, 地址:https://github.com/trello/RxLifecycle - 使用
AutoDispose
, 地址:https://uber.github.io/AutoDispose/#overview
这里仅介绍AutoDispose2
的使用github
AutoDispose2
- 引入依赖
implementation 'com.uber.autodispose2:autodispose-android:2.0.0' implementation 'com.uber.autodispose2:autodispose-androidx-lifecycle:2.0.0'
- AutoDispose 解决的问题:
AutoDispose是一种RxJava 2+工具,用于经过处置/取消将RxJava流的执行自动绑定到提供的做用域。一般(尤为是在移动应用程序中),Rx订阅须要中止以响应某些事件(例如,在Android应用程序中执行Activity#onStop()时)。为了支持RxJava 2中的这种常见状况,咱们构建了AutoDispose。web
在 Activity 和 Fragment 中使用
- 解决办法伪代码以下:
myObservable .doStuff() .as(autoDisposable(this)) // The magic .subscribe(s -> ...);
只要这样一行as(autoDisposable(this))
,您将按照做用域指示自动取消订阅myObservable
, 这有助于防止在Observable
发出项目时出现许多错误类别。架构
在 ViewModel 或者 Presenter 中使用
// 构造函数注入 LifecycleOwner,而后在 activity 或者fragment 中传入 this 参数便可。 class MineViewModel(val view:LifecycleOwner) : BaseViewModel() { private val mElapsedRealTime = MutableLiveData<Long>() val countDownTime: MutableLiveData<Long> by lazy { mElapsedRealTime } /** * 开启倒计时 * 加入这一行:AndroidLifecycleScopeProvider.from(view) */ fun getTime(){ // 只处理成功,失败的能够处理能够不处理 runRxLambdaViewModel(AndroidLifecycleScopeProvider.from(view), Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ mElapsedRealTime.postValue(it) }) } }
runRxLambdaViewModel
的代码没啥,主要是使用 kotlin 的扩展函数和高阶函数封装了RxJava
线程切换的代码。ide
源码地址:https://github.com/YGragon/FrameDemosvg
参考
- AutoDispose 官网
- Android架构中添加AutoDispose解决RxJava内存泄漏
- ViewModel 概览
- AutoDispose使用
- AutoDispose解决RxJava内存泄漏(Android)
本文同步分享在 博客“_龙衣”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。函数