App性能优化和内存优化
一、App性能优化
引用
1. 界面优化
1.1 过度绘制
某些组件在屏幕上的一个像素点的绘制次数超过1次。
1.1.1 过度绘制追踪
Android通过蓝色、绿色、浅红色、深红色四种颜色表示界面由低到高四种过度绘制标识。
通过手机“开发者选项”打开“调试GPU过度绘制”来查看应用所有界面及分支界面下的过度绘制情况。
1.1.2 自定义控件
在自定义控件绘制多张图片等绘制重叠的情况下就会出现过度绘制。此时,我们可以通过canvas.clipRect(l,t,r,b)这个方法指定每张图片的绘制面积,即可避免或减少过度绘制的情况发生。
1.2 内存抖动
出现内存抖动的原因是因为大量的对象被创建又在短时间内马上被释放掉,比如:扫码。
1.3 渲染性能
1.3.1 追踪渲染性能
通过手机“开发者选项”打开“GPU呈现分析模式”,查看所有界面及分支界面下的渲染性能。
2. 代码优化
现在大家普遍使用HashMap,HashMap的一个最大缺点就是浪费内存,当HashMap中有100个元素时,HashMap的数组中可不只100个元素,因为数组有预留位置的功能。当向一个数组插入的数据量超过其数组长度的75%时,会创建一个2倍长度数组代替,并将之前1倍长度的数组内部数据拷贝到2倍数组内,此时数组的预留位置更多。Android系统中内存是非常珍贵的,稍有不慎就会OOM。
2.1 ArrayMap
从本质上来说,ArrayMap牺牲了速度,带来的内存的节省。
2.2 SparseArray
主要是为了避免HashMap自动装箱行为。
2.3 Enum
官方强烈建议不要在程序里面使用到enum。
2.4 ListView
2.4.1 使用convertView和ViewHolder复用,且Viewholder应该是静态的,防止外部类引用。
2.4.2 延迟加载。即当滚动条停止时在加载数据。
2.4.3 异步加载图片。
2.4.4 在getView()方法中间可能减少对象的创建,比如设置onClickListener()点击监听器,监听器对象要在构造方法中创建。因为getView()方法会被调用多次,多次创建对象会影响效率和内存。
2.4.5 简化每个Item的布局文件的嵌套层级和复杂度。
2.4.6 局部刷新
notifydatasetchange()方法会造成getView()方法被多次调用,如果我们仅更新ListView某一Item的数据时,通过ListView的getChildAt()方法找到那个Item并调用getView()。
2.5 Parcelable和Serializable
2.5.1 Serializable
Serializable在序列化时使用了反射机制,导致序列化的过程较慢,且会产生大量的临时对象,会更加频繁的触发GC。
2.5.2 Parcelable
因为我们已经知道了序列化的过程,从而不需要反射来推断了。
不过Parcelable需要写大量的代码来支持。
Androidstudio有一个Parcelable插件可以快速实现Parcelable代码。
2.6 遍历列表
应尽可能使用for index的方式便利,减少高级for循环和Iterator遍历方式的使用。
2.7 图片处理
2.7.1 调整解码率
2.7.2 使用inBitmap属性*
3. 其他优化
3.1 优化步骤
收集数据、分析数据、解决问题
3.2 Lint
Lint是Android提供的一个静态扫描应用源码并找出其中的潜在问题的一个强大的工具。
3.3 网络优化
3.3.1 连接服务器优化
IP直连,省去域名解析的操作。
服务器合理部署。北中南三个地区
3.3.2获取数据优化
请求合并,一个界面一次请求数据。
减少请求和返回的数据大小。Gzip压缩POST请求。
数据缓存