Android 性能优化

本文将从布局优化、Bitmap、内存泄漏几个方面讲解 Android 性能优化。

Android 中布局优化
  1. 加载可能性小的布局使用 ViewStub, 在需要使用的时候再动态加载,因为 ViewStub 默认是 VISIBLE_GONE, 不去加载布局,在主动调用 inflate() 或 setVisible() 方法时才会渲染布局。
  2. 尽可能减少布局的层级,比如一般情况下使用 RelativeLayout 可减少层级,在可使用的时候使用 merge 减少层级
  3. 尽可能复用布局,比如 title 布局,使复用性提高
  4. 在适当情况下复用 style, dimen, color 等,以方便维护
  5. 自定义 View 不在 onDraw() 方法中做耗时操作,不得超过 16ms, 系统的每次渲染时间是 16ms, onDraw() 方法超过这个时间,则会导致该 View 没有完全画完就展示,造成卡顿的效果。
内存泄漏

内存泄漏的原因:已不再使用的对象被生命周期更长的强引用对象持有,导致结果是不再使用的内存回收不掉,严重则会导致 OOM.

  1. 忘记释放内存
    比如使用完 cursor 没有调 close(), 使用完 BroadcastReceiver 没有调 unregisterReceiver().

  2. 持有已不再使用对象的强引用
    这种问题一般都是在 Activity 里使用非静态内部类或匿名内部类导致的,因为非静态内部类持有外部类的强引用,当 Activity 被销毁后,还被内部类引用,导致 Activitiy 不能被回收,解决方法就是使用静态内部类来替代。静态内部类不持有外部类引用,若需要 Activity 引用,则在静态内部类中声明一个弱引用成员变量,创建对象时把 Activity 引用赋值,使用时判空。
    比如使用 Handler 导致的,会 new 一个匿名内部类,解决方法就是把 Handler 对象改成静态的。
    比如使用动画时在 onDestroy() 方法中没有取消动画,导致 View 一直引用着 Actvitiy, 解决方法是在 onDestroy() 方法中取消动画。

Bitmap 高效加载

如果一个图片过大,直接加载可能就会导致 OOM, 那么有什么方法来使图片加载更加高效呢,比较常用的就是设置 Options.inSampleSize.
BitmapFactory.decode… 方法可以将资源文件,本地文件,指定的二进制流,文件流加载成 Bitmap, 在加载的过程中有一个参数 Options, 可以通过设置 inSampleSize 对图片进行压缩。

规定 inSampleSize 需要是 2 的整数幂,如果不是,将会自动向下取整,且 inSampleSize 需大于 1, 如果不是,则修改为 1。
若 inSampleSize 设置为 2, 加载后的 Bitmap 宽高是原图的 1/2, 以此类推。

计算 inSampleSize 的方法:
Options 还有一个参数 inJustDecodeBounds, 设置为 true 调用 BitmapFactory.decode…方法不会加载 Bitmap, 且返回值为 null, 只会解析 Bitmap 的宽高并赋值给 Options 的 outWidth 和 outHeight 参数,然后将 Options.inJustDecodeBounds 设为 false, 再根据需要设置 inSampleSize, 然后再加载图片。示例代码:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher, opt);
Log.e("TAG", "outWidth:" + opt.outWidth + ", outHeight:" + opt.outHeight);
opt.inJustDecodeBounds = false;
// 根据实际需要计算
opt.inSampleSize = 4;
Bitmap bitmapScale = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher, opt);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值