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使用中常见的内存泄露问题。

解决方案

在 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线程切换的代码。

参考

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

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

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

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

  1. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  2. ThreadLocal中的3个大坑,内存泄露都是小儿科!

    我在参加Code Review的时候不止一次听到有同学说:我写的这个上下文工具没问题,在线上跑了好久了.其实这种想法是有问题的,ThreadLocal写错难,但是用错就很容易,本文将会详细总结Thre ...

  3. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  4. java焦点事件如何使用_Java中如何释放鼠标事件的焦?

    1.使用MouseListener接口处理鼠标事件 鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出 mousePressed(MouseEvent e) 鼠标按下时调用 mou ...

  5. form字体和颜色java安卓开发_Android 修改App中默认TextView的字体和颜色

    一.别人怎么做 来源 http://stackoverflow.com/questions/3078081/setting-global-styles-for-views-in-android Act ...

  6. java dispose事件_求助!!为什么我的dispose()不起作用

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 c.add(p1); b1.addActionListener(new jbAction1()); b2.addActionListener(new jb ...

  7. java jtextfield 事件_java – 处理JTextField中的编辑事件

    我有一个登录表单,用户可以输入他的凭据进行登录.我有一个JLabel,用于显示告诉用户用户名不能为空的文本.用户在文本字段为空时单击登录按钮后显示此标签. 我想在用户开始在文本字段中输入的那一刻,带有 ...

  8. java ora 28040_Oracle 11g与112c中ORA-28040 错误解决

    今天遇到一个连接192.168.56.102这个库报错 Java.sql.SQLException: ORA-28040: No matching authentication protocol Or ...

  9. 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令

    应用场景 我现在做一个系统登录功能,要求在PasswordBox上输完密码后回车,能够响应Enter事件,并执行ViewModel中对应的方法.如果登录成功则隐藏当前窗口显示主窗体,登录失败则焦点返回 ...

最新文章

  1. android中实现view的更新有两组方法
  2. string用法总结
  3. 想学python有什么用-Python为什么这么火?学习python有什么用?
  4. 入门案例中使用的组件介绍
  5. 华为p9 android版本,华为P9的手机系统是什么
  6. Page Object设计模式实践
  7. 医学方面的创业计划书_【就业创业】设计学院开展2019“汉军杯”大学生创业大赛 初评及复评工作...
  8. java基础的知识_Java基础知识点(一)
  9. linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
  10. 51单片机——多文件的建立
  11. 二维vector初始化方法
  12. Windows Server 2012 R2 官方原版镜像(转载)
  13. 【复变函数与积分变换】第1章 复数——1.1 复数的定义及其四则运算
  14. AKM 48450-1 230B 24B 40mA
  15. KinectGestures
  16. Go语言 linux下开发 IDE -SpaceVim\NeoVim
  17. 云计算与网络安全:无代理安全防护更出色
  18. 面试题总结(2018.7.26开始,持续更新中)
  19. 帝国CMS 小说系统模型创建教程和使用 初级
  20. 数字音乐转型给数字图书带来启示

热门文章

  1. Bailian2992 Lab杯【排序】
  2. POJ NOI0101-08 字符三角形
  3. Java 面试题 —— java 源码
  4. C/C++ 控制台输入
  5. IPython notebook(Jupyter Notebook) 的使用
  6. 辨异 —— 单词(同义词)的辨异
  7. java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...
  8. python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
  9. python零基础学习书-零基础学Python,不容错过的入门书籍
  10. 2018年python工作好找吗-Python的发展状况-2018年