本文来自刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主 ,引用必须注明出处!
一、优化背景:
安卓应用的内存往往是有限的,从开始的8M到16M,24M,32M,48M,64M等逐步变大,但内存的变大是由于分辨率的提高导致,并不意味着内存的可使用量随之增加,而不及时回收(即使Java有自己的垃圾回收机制),容易造成内存过高,引起手机变卡,体验流畅性下降)。
经测试,目前Android8及以上256MB,Android6-7是128MB,测试方法:
Runtime.getRuntime().maxMemory();
-----------------------------------------------------------------------------------------------------------
二、降低内存消耗的办法
有以下几种常见办法:
1、图片声明使用的context使用Application。
回收时清除ImageView的drawable。
但是如果使用context.startActivity会报一个错
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
因此如果确定用application启动activity,要注意加个FLAG_ACTIVITY_NEW_TASK这个flag
但是ProgressDialog,不能使用用application,因为它依赖着当前页面。
2、使用viewStub占位,避免经常使用gone方法,减少对象的加载和初始化
3、使用merge把能合并的布局统统合并,在hierachyviewer里面可以看到布局的复杂度
如果使用include,给布局加margin的话,需要同时设置include标签的宽高
4、去掉decorView和window的背景,往往由于应用有自身的色调搭配
5、通过canvas的clip方法,避免在看不到的地方画图,通过quickReject方法来在确定的区域比如矩形内绘制,
跳过非既定区域内绘制
6、使用9path文件和自定义图片,以及透明背景,来防止过度绘制
7、列表可以给定一个高度(根据item的高度来动态设置),来防止重复计算高度和执行布局方法
8、合理选择组件,选择简单的而非复杂的组件(原因,如果你自定义过复杂组件自己就会明白)
9、开启新进程作为服务进程和工具进程-最大招,有效降低当前应用的内存消耗
10、避免在onDraw频繁调用。
11、 在动画结束或onPause方法里,清除控制的动画效果:mImageView.clearAnimation()
-----------------------------------------------------------------------------------------------------------------
三、避免内存泄露的办法:
1、及时清除对象或回调引用的context(或使用Application),降低引用链长度