关于android的优化问题,相信大家多有过一定的学习,但是我们往往只是了解其中了某一个部分,却缺乏系统的学习,博主在这一块花了较多时间学习,那么下文为大家全面系统地分享各种可以进行性能优化的角度
1.编程技巧
1.1避免创建不必要的对象
1.2合理使用static成员
1如果~方法不需要操作运行时动态变量和方法,可将其~
2常量可以申明为static final(这种情况只对基本类型和String适用)
3不要将视图存为static,view对象会引用activity对象,activity退出时无法销毁,内存泄露
1.3避免内部Getters/Setteers
点击打开链接
1.4使用增强型for循环(在使用Arraylist时候,普通for循环效率更好)
1.5使用package代替private,以便内部类高效访问外部类成员
1.6合理使用浮点数(
1. 需要了解你表示的数的范围
2. 不用浪费空间,最少可满足表示即可。)
1.9其他情况
2.视图优化,解决UI卡顿
2.1卡顿原理:渲染炫酷动画时,每16ms要渲染一次,人眼极限所决定,否则失帧 overdraw:某个像素点在一帧内被绘制多次,常常出现于多次UI,例子:activity有背景,layout也有背景,子view有背景,可以移除不必要的
2.2卡顿原因分析
1人为在UI线程做轻微(不至于ANR)耗时操作
2layout过于复杂,16ms内无法渲染完成,背景层叠过多
3同时执行过多动画(CPU,GPU负载过度)
4某个像素点一帧内被绘制多次(体现在代码上)
5view频发触发measure和layout导致耗时过多,view频繁重新绘制
6内存频繁GC,阻塞渲染操作
7冗余资源冗余代码,逻辑过于复杂,执行过慢
8ANR
2.2解决对策
1采用<merge>优化布局层数<include>共享布局
2延时加载view,采用viewstub(惰性加载)避免一些不经常使用的视图。或者在网络视图没加载出来之前,可以把相关组件,设置setvisibility为gone,网络加载成功再设置为true
3.用位置来代替长和宽,减少运算和layout摆放次数
4.item使用过多嵌套时候,用自定义view来替代,减少image测量和layout摆放次数
5.避免在顶层使用RelativeLayout,尽量用LinearLayout代替,如果LinearLayout要实现复杂布局,尽量用Relativelayout避免嵌套,Relativelayout避免用layoutweight
6.布局优化其他的一些干货:
过度绘制的解决方法:布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片
自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。
在清单文件中打开硬件加速,这种情况是在无法解决过度绘制或解决起来很麻烦的情况下可以使用。不过硬件加速好像会与自定义视图冲突,所以也不是想开就开
关于过度绘制
点击打开链接
另外,关于UI卡顿原因的检测,可以参考
3关于listview,recycle人view的优化
4.关于android的一些缓存机制
4.1WebView的缓存,Session Storage和Local Storage两种,分别用于会话级别的存储(页面关闭即消失)和本地化存储(除非主动删除,否则数据永远不会过期)
4.2三级缓存
4.3一个轻量级缓存
ASimpleCache
ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。
5.关于内存泄露问题
关于handler的内存泄漏问题(之前没学好,这里再次强调一下)
一些其他的性能优化干货
点击打开链接