Android性能优化总结

一、性能优化:

分为三个大方向:布局优化、绘制优化、内存优化

(1)布局优化(5种):

①删除布局中无用的控件和层级

②有选择地使用性能较低的ViewGroup。

既可以使用RelativeLayout和LinearLayout时,且不影响层级的前提下,选择LinearLayout。

RelativeLayout会对子View进行两次的onMeasure,横向和纵向各一次。而LinearLayout只onMeasure一次。

但如果LinearLayout使用weight时,LinearLayout也会进行两次的onMeasure。

③使用<include>标签重用Layout

④使用<merge>标签减少层级

⑤使用ViewStub实现View的延迟加载

(1.使用setVisibility或inflate,后者可以返回布局的引用,从而可以再通过View.findViewById()方法找到对应的控件

2.ViewStub在使用时才渲染整个布局,而View.GONE在初始化布局树时,已经添加在布局树上)

(2)绘制优化:

主要指View的onDraw方法避免执行大量的操作

①onDraw中不要创建新的局部对象

②onDraw中不要做耗时的任务

(3)内存优化(7种):

①对常量使用static修饰符

②使用静态方法

③减少不必要的成员变量

④减少不必要的对象

⑤尽量不要使用枚举,少用迭代器

⑥对Cursor、FIle、Context、BroadcastReceiver进行资源的释放,关闭、注销。

⑦静态变量的慎重使用,避免引用资源耗费过多的实例,比如context。

⑧ListView优化:

  1.复用converView,减少不必要的view的创建;

  2.使用converView的setTag和getTag方法将view与相应的viewHolder绑定,减少findViewById操作;

  3.使用RecycleView代替ListView,因为RecycleView可以实现单个item的刷新。

⑨Bitmap优化:

  1.使用BitmapFactory.Options进行采样,然后算出需要压缩的比例大小,对图片进行压缩

部分关键代码:

// 获得图片的宽和高,并不把图片加载到内存中
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);

options.inSampleSize = caculateInSampleSize(options,
        width, height);

// 使用获得到的InSampleSize再次解析图片
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);



/**
 * 根据需求的宽和高以及图片实际的宽和高计算SampleSize
 *
 * @param options
 * @param reqWidth
 * @param reqHeight
 * @return
 */
public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth,
                                       int reqHeight)
{
    int width = options.outWidth;
    int height = options.outHeight;

    int inSampleSize = 1;

    if (width > reqWidth || height > reqHeight)
    {
        int widthRadio = Math.round(width * 1.0f / reqWidth);
        int heightRadio = Math.round(height * 1.0f / reqHeight);

        inSampleSize = Math.max(widthRadio, heightRadio);
    }

    return inSampleSize;
}

 

  2.使用软引用

3.使用二级缓存(内存缓存和磁盘缓存)

  4.使用完后,使用recycle()进行资源回收。

  5.图片加载可以使用一些成熟的框架,比如Gilde、Picasso之类的加载

⑩线程优化:

   1.将线程的内部类改为静态内部类(因为非静态内部类拥有外部类对象的强引用,静态内部类则没有)。

   2.使用弱引用来保存context引用。

 

 

二、优化工具与手段:

①TraceView:数据采集和分析工具

②Lint:软件代码静态分析工具

③MemoryMonitor:内存泄漏分析工具

④LeakCanary:内存泄漏检测利器

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值