Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题 不念不忘少年蓝@ 2022-12-12 15:16 78阅读 0赞 # 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`使用中常见的内存泄露问题。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2Rvbmc_size_16_color_FFFFFF_t_70_pic_center] # 解决方案 # * 在 onSubscribe(d: Disposable) 回调中保存 dispose ,在页面关闭的时候调用`.dispose()` 方法 * 使用`RxLifeCycle` , 地址:[https://github.com/trello/RxLifecycle][https_github.com_trello_RxLifecycle] * 使用`AutoDispose` , 地址:[https://uber.github.io/AutoDispose/\#overview][https_uber.github.io_AutoDispose_overview] 这里仅介绍`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<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`线程切换的代码。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2Rvbmc_size_16_color_FFFFFF_t_70_pic_center 1] 源码地址:[https://github.com/YGragon/FrameDemo][https_github.com_YGragon_FrameDemo] # 参考 # * [AutoDispose 官网][https_uber.github.io_AutoDispose_overview] * [Android架构中添加AutoDispose解决RxJava内存泄漏][Android_AutoDispose_RxJava] * [ViewModel 概览][ViewModel] * [AutoDispose使用][AutoDispose] * [AutoDispose解决RxJava内存泄漏(Android)][AutoDispose_RxJava_Android] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2Rvbmc_size_16_color_FFFFFF_t_70_pic_center]: /images/20221123/c30bf879ee464224b363b842de42bf1d.png [https_github.com_trello_RxLifecycle]: https://github.com/trello/RxLifecycle [https_uber.github.io_AutoDispose_overview]: https://uber.github.io/AutoDispose/#overview [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2Rvbmc_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221123/efa59c16141a420c8e9872d585714fcc.png [https_github.com_YGragon_FrameDemo]: https://github.com/YGragon/FrameDemo [Android_AutoDispose_RxJava]: https://blog.csdn.net/mq2553299/article/details/79418068?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160164712019195246649511%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160164712019195246649511&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-1-79418068.pc_v2_rank_blog_default&utm_term=autodispose&spm=1018.2118.3001.4187 [ViewModel]: https://developer.android.google.cn/topic/libraries/architecture/viewmodel?hl=zh-cn [AutoDispose]: https://www.jianshu.com/p/c7cbb558b414 [AutoDispose_RxJava_Android]: https://www.jianshu.com/p/4b25ac968afe
相关 内存泄露在Java应用中的常见问题 内存泄露是Java编程中常见的性能问题,它会导致系统可用内存逐渐减少,直到耗尽。以下是几个Java应用中内存泄露的常见问题: 1. **对象引用不释放**:当一个对象被创建, 刺骨的言语ヽ痛彻心扉/ 2024年09月15日 19:12/ 0 赞/ 10 阅读
相关 理解和解决Java中的内存泄露问题 在Java中,内存泄漏通常是指对象或者资源被创建后,无法正确释放,导致系统可用内存不断减少的问题。 解决Java中的内存泄露问题,一般需要遵循以下几个步骤: 1. **理解 你的名字/ 2024年09月15日 00:42/ 0 赞/ 15 阅读
相关 理解并解决Java中的内存泄露问题 在Java中,内存泄漏可能出现在多个地方。以下是几种常见的内存泄露解决方案: 1. **垃圾回收机制**: - 保证对象引用不再有作用时,垃圾回收器会自动回收这些内存。 ╰+攻爆jí腚メ/ 2024年09月14日 19:00/ 0 赞/ 18 阅读
相关 Java中的内存泄露问题及解决方案 在Java编程中,内存泄露是一个常见的问题。简单来说,内存泄露是指程序无法释放已申请但不再使用的内存空间。 解决Java内存泄露问题的方法主要包括以下几个方面: 1. ** Bertha 。/ 2024年09月12日 19:06/ 0 赞/ 14 阅读
相关 理解并解决Java中的内存泄露问题 在Java中,内存泄露是指程序申请了一块内存后,在没有释放该内存的情况下,这块内存一直被占用。这样会导致系统的可用内存逐渐减少。 以下是一些常见的内存泄露解决方案: 1. 阳光穿透心脏的1/2处/ 2024年09月11日 20:09/ 0 赞/ 13 阅读
相关 Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题 RxJava 的内存泄露问题 > runRxLambda 和 runRxLambdaViewModel 只是个扩展函数,可以不用理会,下面两段代码唯一的区别就是第二段增加 不念不忘少年蓝@/ 2022年12月12日 15:16/ 0 赞/ 79 阅读
相关 android中使用handler造成内存泄露的分析和解决,Handler导致内存泄露分析 【JavaEE企业应用实战学习记录】logFilter package sanglp.servlet; import javax.servlet.\; import java 偏执的太偏执、/ 2022年10月05日 01:47/ 0 赞/ 168 阅读
相关 Android 中 Handler 内存泄露解决办法实例 对于Handler内存泄露产生的原因这里就不说了,我就直接贴代码弱引用的解决办法。 1.提取了一个公共的内 BaseHandleReference import 痛定思痛。/ 2022年08月18日 00:40/ 0 赞/ 130 阅读
相关 一个常见的android内存泄露 问题 最近在公司看一个算比较大的android项目的源码,发现了一个很严重的问题,就是项目里使用单例模式,构造函数要传入Context做参数的类,基本上都存在内存泄露问题。我想这 亦凉/ 2022年07月28日 01:15/ 0 赞/ 146 阅读
还没有评论,来说两句吧...