java dispose事件_Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题

RxJava 的内存泄露问题

runRxLambda 和 runRxLambdaViewModel 只是个扩展函数,可以不用理会,下面两段代码唯一的区别就是第二段增加了 AndroidLifecycleScopeProvider.from(view),这也导致了第二段代码不会出现内存泄露,而第一段代码会出现内存泄露。

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)

})

下面的日志对应的操作流程是:跳转一个页面后点击一个按钮,执行上面的两段代码,然后立即返回上一个页面。

通过日志也可以看出第一段代码内存泄露了吧,页面都已经关闭但是相关的逻辑代码还在执行。这就是 RxJava使用中常见的内存泄露问题。

a6313a496dd310251b1887d5429dfd3c.png

解决方案

在 onSubscribe(d: Disposable) 回调中保存 dispose ,在页面关闭的时候调用.dispose() 方法

这里仅介绍AutoDispose2 的使用

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。

在 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()

val countDownTime: MutableLiveData 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线程切换的代码。

6408ba0eb767957b08f28f7ad99d99fd.png

参考

本文同步分享在 博客“_龙衣”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值