扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、为什么要使用DialogFragment:
创新互联专注于荣昌企业网站建设,响应式网站开发,电子商务商城网站建设。荣昌网站建设公司,为荣昌等地区提供建站服务。全流程按需定制开发,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
在程序开发中我们经常要做一些弹窗提醒,如果用自带的Dialog虽然能解决一部分,但强大的UI是不会给你这个机会的,各种自定义UI,时间选择器弹窗,巴拉巴拉~~~
使用DialogFragment就是能配合一些工具进行自定义,同时官方也是比较推荐使用,极大方便了开发,比如自定义一个baseDialogFragment.
二、内存泄漏的原因:
源码如下:
但一般在DialogFragment的源码默认实现了对dialog的取消和结束的监听:
根据源码分析,DialogFragment的dialog的变量Handler对DialogFragment持有。
网上有些分析是直接置为空,但是根本不能解决问题,在super.onActivityCreated(savedInstanceState)中仍然会handler先持有DialogFragment。
最终解决方案,重写onActivityCreated方法,并在super.onActivityCreated(savedInstanceState),修改dialog显示.
依赖库即可,重点在分析工具和分析方法:
debugImplementation'com.squareup.leakcanary:leakcanary-android:2.8.1'
分析工具:MAT 、AndroidStudioProfiler 和 自带分析工具;
这里先看一下Leaking的状态(YES、NO、UNKNOWN),NO表示没泄露、YES表示出现泄漏、UNKNOW表示可能泄漏。
具体学习资料: 学习资料
首先了解下Android中最重要的四大内存指标的概念
我们主要使用USS和PSS来衡量进程的内存使用情况
dumpsys meminfo命令展示的是系统整体内存情况,内存项按进程进行分类
查看单个进程的内存信息,命令如下
adb shell dumpsys meminfo [pid | packageName]
Objects中Views、Activities、AppContexts的异常可以判断有内存泄露,比如刚退出应用,查看Activites是否为0,如果不为0,则有Activity没有销毁。
具体用法直接参考大佬的资源即可,不赘述。
android studio 中Memory Profile的用法
接入LeakCanary,监控所有Activity和Fragment的释放,App所有功能跑一遍,观察是否有抓到内存泄露的地方,分析引用链找到并解决问题,如此反复,直到LeakCanary检查不到内存泄露。
adb shell dumpsys meminfo命令查看退出界面后Objects的Views和Activities数目,特别是退出App后数目为否为0。
打开Android Studio Memory Profiler,反复打开关闭页面多次,点击GC,如果内存没有恢复到之前的数值,则可能发生了内存泄露。再点击Profiler的垃圾桶图标旁的heap dump按钮查看当面内存堆栈情况,按包名找到当前测试的Activity,如果存在多份实例,则很可能发生了内存泄露。
不是成功来得太慢,只是下的功夫还不够
最近在写一个关于贝塞尔曲线水波纹的小DEMO,发现关闭当前视图时报出内存泄漏的问题,检查下内存泄漏信息,经过排查发现是ValueAnimator的监听事件引起的,
先上解决方法:
在Activity/Fragment销毁时调用如下方法:
找到问题就好办了,查源码
检查发现在ValueAnimator start()方法中有个 addAnimationCallback(0); 调用,继续检查发现
这里就发现问题了, AnimationHandler.getInstance(); 这个是单例获取,所以在退出Activity时,ValueAnimator没有被释放,找到问题就好办了,就在Activity或者Fragment被销毁时,主动把动画监听取消掉。最后上一下我Demo的效果图 \得意
内存泄漏是指分配出去的内存无法回收了
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
内存溢出是指程序要求的内存,超出了系统所能分配的范围,从而发生溢出。
内存溢是指在一个域中输入的数据超过它的要求而且没有对此作出处理引发的数据溢出问题,多余的数据就可以作为指令在计算机上运行。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流