最近在做实训项目的时候,发现界面总是卡顿,起初以为是手机内存不够,所以没有过多的重视这个问题,然而最近这几天发现问题越来越严重,因此不得不考虑一下优化的问题。
说到优化,我个人任务并没有什么统一的理论,在优化的过程中还是开发者的经验起主导作用。下面就简单的介绍一下我所了解的性能优化的知识。
首先说一下我遇到的界面卡顿的问题,原因是在我们的项目中有一个界面要展示大量用户的头像,而我们为了美观将显示的头像手动裁剪成了圆形,最终确定界面卡顿的原因就是因为裁剪过程的开销较大,加上图片数量太多,导致界面卡顿。最终我们的解决方案是:不采用裁剪手段,而是在原来正常的ImageView上面覆盖一个写好的Layout,这个layout是圆形的。因此与裁剪出来的效果是一样的。
com.joooonho:selectableroundedimageview:1.0.1
这个自定义的控件就是采取的这种思路。
上面的问题可以归类于布局优化。接下来我们归纳一下主要的与Android优化有关的问题。
布局优化
思想就是尽量减少布局文件的层级。可以使用性能较低的布局,比如LinearLayout、RelativeLayout、FrameLayout等。再有就是使用<include>标签、<merge>标签、ViewStub来降低布局的层级。
绘制优化
即View的onDraw()方法中避免大量的操作。
onDraw()方法不要创建心得局部对象,因为onDraw()方法会被频繁的调用,这样就可能在一瞬间产生大量的对象;
onDraw()方法不要做耗时任务,也不能做深度太大的递归和次数很多的循环
内存泄漏优化
主要需要注意:静态变量、单例模式、属性动画的使用,一些资源不使用的时候需要销毁。
ListView的优化
主要的优化手段是:使用VieHolder管理控件、不在getView()方法中处理耗时任务、然后就是要分批加载数据。
ListView的优化手段完全适用于GridView
Bitmap的优化
Bitmap的优化是一个很大的话题:主要是通过BitMapFactory提供的方法,压缩、缓存、回收等手段。
下面是一些性能优化的建议:
1. 避免创建过多的对象
2. 不要过多的使用枚举
3. 常量使用static final 来修饰
4. 尽量使用Android和Java里面内部的数据结构解决问题
5. 适当的使用软引用和弱引用
6. 灵活使用缓存
7. 尽量采用静态内部类