当前位置: 首页 > news >正文

网站关键字多少合适企业商城网站建设价格

网站关键字多少合适,企业商城网站建设价格,做装修的网站有哪些内容,大连手机自适应网站建设电话案例4——异步任务内存泄漏 异步任务,代指起子线程异步完成一些数据操作、网络接口请求等,通常会使用以下API: Runnbale,Thread,线程池RxJavaHandlerThread 而这些异步任务很有可能操作内存泄漏,下面我们以Rxjava为…

案例4——异步任务内存泄漏

异步任务,代指起子线程异步完成一些数据操作、网络接口请求等,通常会使用以下API:

  1. Runnbale,Thread,线程池
  2. RxJava
  3. HandlerThread

而这些异步任务很有可能操作内存泄漏,下面我们以Rxjava为例,演示此问题,线程、线程池的问题也类似,就不再一一演示了。
大多数项目的网络基础库,传入Rxjava的是匿名Observer,任务过多时,未执行的任务的Observer会持有当前页面的引用,造成内存泄漏,接下来我们将演示这个场景

先提出几个问题:

  1. rxjava就会存在内存泄漏吗?
  2. subscribe传入的匿名内部类Consumer实例不会造成内存泄漏吗?
  3. 异步任务返回时,Activity已经处于onDestroyed状态,Observer持有`Activity引用,Activity内存还能被回收吗?

我们来验证一下rxjava的泄漏场景:
假设我们在Activity#onResume方法里,写了异步任务,任务结束后,设置view的属性,在任务结束之前,我们会调用Activity#finsh操作退出当前页面,如下坨屎:页面在12秒后实际已经处于`onDestroyed状态了

为了演示问题,我将延时时间增大,写成12秒,模拟异步任务返回的情况

Observable.timer(12000, TimeUnit.MILLISECONDS).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {@Overridepublic void accept(Long aLong) throws Exception {dataBinding.layoutWelcome.setVisibility(View.GONE);...其他view 的引用}});

测试步骤为:

  • 进入Activity
  • 立刻退出Activity
  • 一段时间之后观察Activity的内存是否被回收

我们得到一份hprof文件,来分析下

在这里插入图片描述
老规矩先看下Instance-Details-Instance区域,Activity的生命周期onDestroyed的值是否为true,按步骤点击一看,确实为true,证明Activity已经离开窗口了,处于销毁的生命周期中,我们期望的时候垃圾回收器可以回收Activity占据的内存,但事实上我们在Hprof文件看到了,表明Activity占据的内存未回收。

紧着着我们面临下一个问题,如何找到导致Activity内存泄漏的原因呢?谁引用了Activity?

点击Instance-Details-References区域,我们可以很快得到答案,按步骤点击Jump to Source

在这里插入图片描述

果然,立刻跳转到内存泄漏所在的代码块,终于我们通过分析hprof文件找到了问题所在:

在这里插入图片描述

那么如何解决此问题呢?

rxjava提供了CompositeDisposable解决此类泄漏问题,做法如下:

创建实例对象

   /*** 管理rxjava的任务,及时释放,不执行emitter#onNext*/public CompositeDisposable compositeDisposable = new CompositeDisposable();

用compositeDisposable实例去控制任务的生命周期

 compositeDisposable.add(Observable.timer(12000, TimeUnit.MILLISECONDS).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {@Overridepublic void accept(Long aLong) throws Exception {dataBinding.layoutWelcome.setVisibility(View.GONE);processIntent(getIntent());}}));

页面生命周期onDestroyed期间清空任务

   @Overrideprotected void onDestroy() {super.onDestroy();compositeDisposable.clear();}

总结

优化后的效果:
在这里插入图片描述
优化后可看到Depth为空,GC root 为空,表明没有其他实例引用Activity了,当垃圾回收器扫描到此实例,该实例内存会被回收。
还记得开头的问题吗?

  1. rxjava就会存在内存泄漏吗?答:会存在,consumer作为Activity的内部类,持有当前Activity的引用,任务未结束,Activity已销毁就会出现内存泄漏
  2. subscribe传入的匿名内部类Consumer实例不会造成内存泄漏吗?答:只要是匿名内部类,就很有可能内存泄漏,上例子已经证明会产生内存问题。
  3. 异步任务返回时,Activity已经处于onDestroyed状态,Observer持有`Activity引用,Activity内存还能被回收吗?答:无法被回收
http://www.yayakq.cn/news/888570/

相关文章:

  • 平阳企业网站建设群晖wordpress插件
  • 大朗网站仿做福步外贸官网
  • 淘宝网站可以做轮播吗wordpress轮播框
  • 苏州网站建设品牌网站空间租赁
  • 深圳网站建设黄浦网络-技术差小程序推广运营的公司
  • 湘潭响应式网站建设 磐石网络建设局全称是什么
  • 海南网络广播电视台地震避险常识百度seo排名点击
  • 肥东住房和城乡建设部网站网站ui设计素材
  • 绍兴柯桥建设局网站wordpress导航条加搜索
  • 网上做效果图网站有哪些软件有哪些怎么用dw做简单网站
  • 在线音乐网站 用什么做哈尔滨优化网站排名
  • 怎样找出那些没有做友链的网站滨州北京网站建设价格低
  • 网站建设的工期拖延如何解决网站添加背影音乐怎么做
  • 笑话网站代码市场营销与网络营销
  • 网站建设兼职合同模板word可以做网页
  • php网站301重定向免费网站模版下载
  • 免费创立网站摄影素材库网站
  • 网站课程设计报告高级网络技术工程师
  • 网站改版是什么wordpress文章更新软件
  • 有没有外国人做发明的网站开发平台 learn
  • 什么自己做网站wordpress实现瀑布流
  • wordpress 后台登陆哈尔滨seo优化排名免费咨询
  • 西安网站有哪些手续费网站建设页面生成
  • php做网站都需要学什么软件国家企业信息信用信息系统查询
  • 网站建设 优势网络营销的方法有哪些
  • 广州网站优化关键词排名最新网页传奇
  • 广州网站建设设计公司手机网站开发模拟器
  • 如何建网站开网店重庆有哪些做网站的公司
  • 深圳网站建设服务哪家便宜网站建设请示报告
  • 海东市网站建设网站建设过程论文