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使用中常见的内存泄露问题。
解决方案
在 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 的内存泄露问题相关推荐
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- ThreadLocal中的3个大坑,内存泄露都是小儿科!
我在参加Code Review的时候不止一次听到有同学说:我写的这个上下文工具没问题,在线上跑了好久了.其实这种想法是有问题的,ThreadLocal写错难,但是用错就很容易,本文将会详细总结Thre ...
- android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...
- java焦点事件如何使用_Java中如何释放鼠标事件的焦?
1.使用MouseListener接口处理鼠标事件 鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出 mousePressed(MouseEvent e) 鼠标按下时调用 mou ...
- form字体和颜色java安卓开发_Android 修改App中默认TextView的字体和颜色
一.别人怎么做 来源 http://stackoverflow.com/questions/3078081/setting-global-styles-for-views-in-android Act ...
- java dispose事件_求助!!为什么我的dispose()不起作用
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 c.add(p1); b1.addActionListener(new jbAction1()); b2.addActionListener(new jb ...
- java jtextfield 事件_java – 处理JTextField中的编辑事件
我有一个登录表单,用户可以输入他的凭据进行登录.我有一个JLabel,用于显示告诉用户用户名不能为空的文本.用户在文本字段为空时单击登录按钮后显示此标签. 我想在用户开始在文本字段中输入的那一刻,带有 ...
- java ora 28040_Oracle 11g与112c中ORA-28040 错误解决
今天遇到一个连接192.168.56.102这个库报错 Java.sql.SQLException: ORA-28040: No matching authentication protocol Or ...
- 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令
应用场景 我现在做一个系统登录功能,要求在PasswordBox上输完密码后回车,能够响应Enter事件,并执行ViewModel中对应的方法.如果登录成功则隐藏当前窗口显示主窗体,登录失败则焦点返回 ...
最新文章
- android中实现view的更新有两组方法
- string用法总结
- 想学python有什么用-Python为什么这么火?学习python有什么用?
- 入门案例中使用的组件介绍
- 华为p9 android版本,华为P9的手机系统是什么
- Page Object设计模式实践
- 医学方面的创业计划书_【就业创业】设计学院开展2019“汉军杯”大学生创业大赛 初评及复评工作...
- java基础的知识_Java基础知识点(一)
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
- 51单片机——多文件的建立
- 二维vector初始化方法
- Windows Server 2012 R2 官方原版镜像(转载)
- 【复变函数与积分变换】第1章 复数——1.1 复数的定义及其四则运算
- AKM 48450-1 230B 24B 40mA
- KinectGestures
- Go语言 linux下开发 IDE -SpaceVim\NeoVim
- 云计算与网络安全:无代理安全防护更出色
- 面试题总结(2018.7.26开始,持续更新中)
- 帝国CMS 小说系统模型创建教程和使用 初级
- 数字音乐转型给数字图书带来启示
热门文章
- Bailian2992 Lab杯【排序】
- POJ NOI0101-08 字符三角形
- Java 面试题 —— java 源码
- C/C++ 控制台输入
- IPython notebook(Jupyter Notebook) 的使用
- 辨异 —— 单词(同义词)的辨异
- java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...
- python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
- python零基础学习书-零基础学Python,不容错过的入门书籍
- 2018年python工作好找吗-Python的发展状况-2018年