Android性能优化

    xiaoxiao2021-03-25  90

    一.为什么需要性能优化:

    Android作为移动设备,相比较于pc端而言,在内存和cpu的性能方面都有了很大的限制,不像pc端就有很高的内存和cpu性能,过多的内存调用,有很大的可能性造成内存溢出.过多的使用cpu资源,一般是指做大量的耗时操作,由于在Activity超过5秒回出现ANR(Application No Responsing),广播是十秒,service是二十秒.为了提高用户的良好的用户体验和提高程序的性能,需要对性能进行优化.

    二.从那几个方面进行性能优化:

    主要是下面几个方面记行性能的优化操作;

    1.布局优化  

    2. 绘制优化

    3.内存泄漏优化

    4.相应速度的优化

    5.listview的优化

    6.Bitmap的优化

    7.线程优化等

    三.具体放入说明:

    1.##布局优化:

    第一点就是: 能使用LinearLayout和FrameLayout布局来实现的尽量不适用RelationLayout俩实现,要是实现不了使用相对布局,但是相对布局的嵌套层级尽量减少,是的绘制的过程所需要的时间大大的减少.

    第二点就是; 使用#include标签,达到布局的复用;还可以使用<merge>标签和<ViewStub>标签;一般来说<include>标签和<merge>标签是搭配使用的;

    <ViewStub>提供了按需加载的功能.需要的时候才会将ViewStub中的布局加载到布局的内存中.

    对于### <ViewStub>的简单说明 :

    >第一就是: ViewStub是继承View的;是一个非常轻量级的控件,并且他的宽和高都是0; >第二点: 他不参与任何的布局和和绘制过程.

    2.##绘制优化:

    是指 View的onDraw()方法避免执行大量的操作;主要体现在连个方法: 第一: onDraw()中不要创建大量的局部对象 第二: onDraw()  不要做耗时操作.

    3.##内存泄漏优化

     常识: 内存溢出(OOM):申请内存的时候,没有足够的空间,就会报内存溢出的问题.            内存泄漏:申请内存后,没有释放已申请的内存空间,内存泄漏或导致内存溢出;   内存泄漏的优化方面:

    第一就是避免写出内存泄漏的代码 第二:使用分析工具找到内存泄漏的代码: >Android内存优化策略: 1)在循环内尽量不要使用局部变量 2)不用的对象即时释放,即指向NULL  3)数据库的cursor即时关闭。 4)构造adapter时使用缓存contentview 5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver() 6)即时关闭InputStream/OutputStream。 7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle  8)尽量避免static成员变量引用资源耗费过多的实例。  ###内存泄漏中常见的造成的方式;  第一就是 : 使用静态变量导致内存泄漏 第二就是:单例模式导致的内存泄漏    原因就是; 单例模式的声明周期和appliaction的生命周期的一致的. 第三就是: 属性动画导致的内存泄漏

    4.##响应速度优化

    尽量不要在主线程中执行耗时操作,activit相应的时间是五秒,广播是10面,intentService是20秒,不然会出现ANR现象.

    5.##listview优化

    listview的不复用缓冲也会造成内存泄漏或内存溢出; listview的优化: 第一: 就是复用缓冲 第二: 使用viewholder来设置控件的获取 第三: 就是分页加载和图片的异步加载(也就是三级缓存思想,内存,sd,最后是网络) 分页加载就是设置获取的页数,确定每一页加载的数量,设置listview的滚动监听事件,当listview定制滑动,并且滑动到listvie的最后一页的情况下,我们再去获取下一页的数据;   ###listview在加载过程中出现的问题:

        大牛的博客连接:Android ListView异步加载图片乱序问题     [http://blog.csdn.net/guolin_blog/article/details/45586553](http://blog.csdn.net/guolin_blog/article/details/45586553 "Android ListView异步加载图片乱序问题,原因分析及解决方案 ") 自己总结:    造成的原因就是我们在设置图片的时候,我们在滑动的时候,由于获取解析图片是一个比较耗时的操作,那么第一个题目或许还没有解析完全,我们滑动不可见,此时原先第一个条目解析完全,会设置现在的第一个位置,出现图片的错位. 解决方法:

    第一种方法就是;在findviewbyid的时候设置一个标签,到时根据是否设置了tag来设置t图片,设置图片就会有tag,没有就没有设置图片,就不会错位了! 第二种的方法:使用软引用  第三种: 使用 NetWorkImageView控件  是在Volley中提供的,里面已经给我实现好了!

    6.##bitmap优化

    Bitmap使用过多,没有及时的回收也会造成内存泄漏或者内存已溢出; ###Lru (Least Recently Used) 这是一个算法,最近最少使用原则; 核心思想就是; 当缓冲快满的时候,会淘汰近期最少使用的缓冲目标. ### BitMap高效的加载展示图片使用Options来设置加载图片信息. 通过使用BitMapFactory.Options来缩放图片,主要用到了他的inSampleSize参数,也就是我们说的采样率;当inSampleSize的大小为1的时候,采样后的图片为原始的大小, 当inSampleSize的值为2的话,我们采样后的图片的高和宽都是原图的二分之一,大小是原图的四分之一;采样率对图片的高和宽都有效果. ### Bitmap加载大图片的处理 第一种就是: 等比例缩小图片,也就是使用采样率来; 第二种就是:压缩质量  或者使用第三方框架 android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。 Android加载大量图片内存溢出解决方案: 1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source  2)使用BitmapFactory.Options对图片进行压缩  InputStream is = this.getResources().openRawResource(R.drawable.pic1);  BitmapFactory.Options options=new BitmapFactory.Options();  options.inJustDecodeBounds = false;  options.inSampleSize = 10; //width,hight设为原来的十分一  Bitmap btp =BitmapFactory.decodeStream(is,null,options);  3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载 及时销毁不再使用的Bitmap对象  if(!bmp.isRecycle() ){  bmp.recycle() //回收图片所占的内存  system.gc() //提醒系统及时回收  }

    7.线程优化:

    核心思想: 就是使用线程池来管理线程,线程池可以理解为一个存放线程的一个池子,只不过里面有是已经创建好的线程,使用的时候直接使用创建好的线程,避免了线程的大量创建和销毁,线程池还能有效的控制线程的最大并发数:避免大量的线程因为抢夺系统资源而导致阻塞现象的发生.

      具体的链接: Android中的线程和线程池及其源码分析:

    Android中线程和线程池及其异步加载

    转载请注明原文地址: https://ju.6miu.com/read-17653.html

    最新回复(0)