Android开发学习和思考程序员

Android性能优化|SquirrelNote

2017-10-31  本文已影响9人  跳动的松鼠

系列文章:
Android性能优化|SquirrelNote
Android性能优化:布局优化实践|SquirrelNote
Android性能优化:图片的加载和图片缓存技术|SquirrelNote
Android照片墙应用实现|SquirrelNote

简介

Android设备作为一种移动设备,不管是内存还是CPU的性能都受到了一定的限制,过多地使用内存会导致程序内存溢出,即OOM。而过多地使用CPU资源,即做大量的耗时任务,会导致手机变得卡顿甚至出现程序无法响应的情况,即ANR。

Android的性能优化的方法

  1. 可以优化加载布局,对convertview进行判空操作,缓存listView里面已经加载好的view;
    不然假如有1000条数据,那么我们滑动,就会 产生1000个convertview ,这对内存是很大的浪费,所以 我们一定要复用。

  2. 优化加载控件,减少findViewById的次数,使用viewholder去管理这些id,通过tag去直接拿到id;

  3. 在adapter适配器中的getView方法中尽量少使用逻辑,可以将这些逻辑代码放在别的地方;

  4. 如果listView里面数据量比较大的话,可以采用分批和分页加载;
    比如:ListView有十万条数据,如果将十万条数据加载到内存,很消耗内存
    解决办法:通常做法是我们将这10万条数据分为1000页,每一页100条数据,每一页加载时都覆盖掉上一页中List集合中的内容,然后每一页内再使用分批加载,这样用户的体验就会相对好一些。
    (比如说1000条新闻的List集合,我们一次加载20条,等到用户翻页到底部的时候,我们再添加下面的20条到List中,再使用Adapter刷新ListView,这样用户一次只需要等待20条数据的传输时间,不需要一次等待好几分钟把数据都加载完再在ListView上显示。其次这样也可以缓解很多条新闻一次加载进而产生OOM应用崩溃的情况。)

  5. 另外,对listView中的一些类似图像,进行图片的优化。
    如果ListView中需要显示从网络上下载的图片的话,我们不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要在监听器里面监听ListView的状态,如果没有滑动,就开始加载图片,如果滑动的时候,停止加载图片。

大概从这几个方面进行ListView的优化。

下面进行详细分析:

布局优化

布局优化的思想,就是尽量减少布局文件的层级。
如何进行布局优化呢?
删除布局中无用的控件和层级,有选择地使用性能较低的ViewGroup,比如LinearLayout.如果布局中既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,这是因为RelativeLayout比较复杂,它的布局过程花费更多的CPU时间.如果布局是嵌套使用时,一般建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局文件的层级,同样会降低程序的性能。

布局优化的另外一种方法是采用<include>标签、<merge>标签和ViewStud。<include>标签主要用于布局的重用,<merge>标签一般和<include>标签配合使用,它可以降低减少布局的层级,而ViewStudb则提供了按需加载的功能,当需要时才会将ViewStud中的布局加载到内存,这提高了程序的初始化效率。

绘制优化

在View的onDraw方法中避免执行大量的操作。主要体现在以下两方面:
首先,onDraw中不要创建新的布局对象,这是因为onDraw方法可能会被频繁调用,否则就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁的gc,降低了程序的执行效率。
另一方面,onDraw方法中不要做耗时的任务,也不能执行成千上万次循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

内存泄漏优化

一方面在开发中避免写出内存泄漏的代码,另一方面通过使用内存泄漏工具MAT,可以发现一些开发过程中潜在的内存泄漏问题。

需要了解:什么是内存泄漏,什么是内存溢出。

常见的内存泄露举例:

(创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,这样在回收时也可以回收Handler持有的对象,这样虽然避免了Activity泄漏,不过Looper线程的消息队列中还是可能会有待处理的消息,所以我们在Activity的Destroy时或者Stop时应该移除消息队列中的消息)
Handler的使用造成的内存泄漏问题应该说最为常见了,平时在处理网络任务或者封装一些请求回调等api都应该会借助Handler来处理,对于Handler的使用代码编写一不规范即有可能造成内存泄漏.

内存泄漏检测工具:AS自带的工具 Eclipse中的heap
LeakCanary 是一个开源的在debug版本中检测内存泄漏的java库。
这些开发工具,可以看到堆内存,利用这个检测工具,在打开一个界面的时候看创建了多少个对象,在退出这个界面的时候,默认情况下垃圾回收器会把垃圾回收,如果对象的数量没有减少,有可能说这个界面会出现内存泄漏的问题.

BitMap优化

BitMap优化技巧

以上是根据我的一些理解,做的总结分享,旨在抛砖引玉,希望有更多的志同道合的朋友一起讨论学习,共同进步!

上一篇 下一篇

猜你喜欢

热点阅读