Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题

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

在这里插入图片描述

解决方案

这里仅介绍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

参考

本文同步分享在 博客“_龙衣”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。函数

相关文章
相关标签/搜索