Android性能优化

原创 2016年06月01日 09:56:05
  • 使用LocalBroadcastManager

使用Context的registerReceiver和sendBroadCast注册发送广播是全局范围的,或者说是整个系统范围的,而LocalBroadcastManager限定只在我们的app进程中,不用担心广播发送的数据往外泄露,同时外部应用也无法通过广播调起我们的app,因此更加安全。

  • convertView复用

如果使用ListView或者GridView,注意convertView复用以及ViewHolder的使用,可以不用每次都创建新的布局以及进行findViewById这样费时的操作,即使某种itemType类型的itemView数量只有一个。推荐使用RecyclerView,功能更强大,性能更好,并且为我们封装好了View复用工作。

  • 合理使用Context

如果需要保存Context信息,尽量使用ApplicationContext,以防内存泄漏。不过,ApplicationContext也不是万能的,ApplicationContext不能用来创建Dialog,不能直接用来启动Activity(需要设置FLAG_ACTIVITY_NEW_TASK标识位),使用ApplicationContext创建的布局使用的是默认的主题样式。如果使用的不是ApplicationContext,切记及时释放Context。

  • 尽量避免使用非静态内部类

Android中创建内部类的情况有很多,例如创建ViewHolder,Adapter等等。如果可以,应该尽量使用静态内部类。一方面,静态内部类不持有外部类的引用,可以一定程度上防止内存泄漏的风险;另一方面,静态内部类不能访问外部类非静态方法,编译时不用为内部类生成访问外部类的接口。

  • SparseArray替代HashMap

SparseArray底层keys和values分别使用数组存储,添加、删除等操作使用binary search二分查找;使用int基本类型作为key类型,避免autobox带来的性能损失;另外,删除操作并不会真的直接移除key和value,只是做了一个DELETED标记,特定时候再统一gc。类似的还有SparseBooleanArray、SparseIntArray、SparseLongArray。

  • 尽量避免使用枚举类型enum

Android对于内存较为敏感,而enum会带来额外的内存开销,在没有必要需求的情况下,例如,定义几个int类型常量type,可以考虑使用final static int代替。官方文档说大概会比静态常量大2倍多。具体计算分析可以参考这篇介绍:Android 中的 Enum 到底占多少内存?该如何用?

  • onPause、onStop释放不必要的资源

在Activity跳转时,onPause和onStop会回调,可以释放一些资源,例如暂停视频音频播放,暂停动画等。但是,同时需要注意的是,不要在onPause中做过多复杂的操作。因此我们知道Activity跳转时,会先回调当前Actiity的onPause方法,如果操作过于复杂,会明显影响Activity跳转速度,带来不好的用户体验。

  • onDraw最好不要进行new操作

很容易造成内存频繁分配、回收,造成内存抖动现象,加大Dalvik虚拟机gc压力。

  • view过度绘制及优化

避免background重复绘制,耗性能。可适当使用ViewStub标签优化性能,减少不必要view的绘制。自定义组件时,可考虑使用merge标签减少层级。使用ReleativeLayout代替LinearLayout完成复杂布局,减少layout层级,单就ReleativeLayout和LinearLayout来说,ReleativeLayout性能不如LinearLayout,但是如果可以减少层级,是划算的。

  • 尽量避免使用依赖注入框架

大部分依赖注入框架,都是基于反射机制实现,编码方便的同时其实降低了App性能。

  • gradle开启ProGuard选项

开启ProGuard选项,打包时可以剔除多余的代码,并且对代码进行混淆,保证代码安全的同时,一定程度上也可以减小dex包大小。需要注意,如果代码中使用了反射可能会报错,可以在proguard rule中配置不对某些特定的类进行混淆来解决问题。另外,开启了ProGuard可能对调试也有影响,导致断点走不到或者查看不到变量值。解决办法是只在release环境下才开启proguard选项,debug模式下不开启。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }
}
  • Bitmap使用优化

通常原始的图片大小并不是我们需要的,有时为了节省内存,在使用ImageView控件加载图片前,我们可以设置需要加载到内存中的bitmap大小。例如:

public static Bitmap resizeBitmap(String filename, int requiredWidth, int requiredHeight){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(filename, options);
    options.inSampleSize = computeSampleSize(options.outWidth, options.outHeight, requiredWidth, requiredHeight);
    options.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeFile(filename, options);
    return bitmap;
}

BitmapFactory.Options的inJustDecodeBounds属性设置为true时,不真正加载bitmap到内存中,但是bitmap的宽高等属性都能获取到。经过比例缩放计算后,我们可以设置BitmapFactory.Options的inSampleSize值,表示bitmap的采样大小,即宽高为原始宽高的几分之一,这时候再加载就可以达到节省内存的效果。注意:inSampleSize的值会自动向下优化为最接近的2的n次方。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android性能优化典范 - 第6季

涉及的内容主要有:程序启动时间相关的三个方面:activity的创建过程,臃肿的application启动对象,主题启动显屏。另外还介绍了减少安装包大小的checklist以及如何使用VectorDr...
  • axi295309066
  • axi295309066
  • 2016年09月25日 10:09
  • 1284

Android性能优化常用方法

本篇博客主要介绍关于性能优化的一些方法,以及性能分析工具的使用。     一 性能优化的常用方法 主要内容包括布局优化,绘制优化,内存泄露优化,相应速度优化,ListView优化,Bitmap...
  • Tyssen
  • Tyssen
  • 2016年01月23日 14:28
  • 1490

Android开发性能优化总结(一)

安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户。 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流。...
  • gs12software
  • gs12software
  • 2016年04月17日 16:04
  • 20566

android 性能优化详解

非常好的一篇内存优化文章: 文章来源:https://www.cnblogs.com/xinmengwuheng/p/7232429.html 这一篇中我们将着重介绍Android的内存优化...
  • zhuxingchong
  • zhuxingchong
  • 2017年12月29日 17:07
  • 134

谷歌官方制作的 android性能优化典范 视频,我下载下来了并做了分享,希望更多人受益吧。

谷歌官方制作的 android性能优化典范 视频,我下载下来了并做了分享,希望更多人受益吧。 http://pan.baidu.com/s/1pJFTjmV...
  • yacoo_tight
  • yacoo_tight
  • 2015年04月09日 10:49
  • 435

Android性能优化系列之布局优化

在Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性、复杂度也会随之增长,这样使得UI布局的优化,显得至关重要,UI布局不慎,就会引起过度绘制,从而造成UI...
  • u012124438
  • u012124438
  • 2017年01月15日 22:20
  • 7382

Android开发性能优化总结(二)

接上一篇《Android开发性能优化总结(一)》 一、安卓UI性能检测与优化 UI是安卓应用程序与用户打交道的最直接途径,UI设计的好不好,直接影响到用户的体验,如果没有达到他们心目中的自然流畅细...
  • gs12software
  • gs12software
  • 2016年04月24日 17:06
  • 6155

Android性能优化策略

本篇主要是对 google推出的性能优化典范 进行一个通篇的整理… 主要在于一些具体的优化技巧、至于 60fps、掉帧、gc、内存抖动、阈值…等等这些性能术语的概念里面不做多概括,请自行查阅…本篇从以...
  • sinat_15877283
  • sinat_15877283
  • 2016年05月30日 10:39
  • 4009

Android性能优化之提高ListView性能的技巧

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能。...
  • nugongahou110
  • nugongahou110
  • 2015年07月29日 15:13
  • 13931

Android面试题-与性能优化相关面试题五

Android面试题
  • mwq384807683
  • mwq384807683
  • 2017年04月21日 13:20
  • 541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能优化
举报原因:
原因补充:

(最多只允许输入30个字)