Android应用性能优化是每个客户端开发人员都需要重视的问题。在Android硬件设备性能不那么好的时候,软件的性能优化是很迫切的事情。但是随着硬件设备的不断升级强大,应用性能优化在大部分项目中很少受到重视。下面我将从几个方面简单介绍Android应用的性能优化。
在对Android应用进行性能优化时,是需要借助工具来寻找问题的。我使用的是友盟+U-APM这款APP性能监测工具,来对APP进行监测的,它的后台对于异常的查询速度是非常快的,使用起来非常方便。
一、代码优化
代码优化说起来好像大家有会去做。Android官方关于编写高效代码的两个基本准则是:(1)不要做冗余的工作。(2)尽量避免次数过多的内存分配操作。
1、数据结构的选择
选择正确合适的数据结构是很重要,Java常用的数据结构有ArrayList、LinkedList、HashMap和HashSet等。我们需要对它们的特点与区别有深入的了解才能编程的时候做出最合理的选择。
2、Handler和内部类的正确用法
Handler使用不当会引起内存泄漏,这个大家应该都知道。具体的原因是Handler会绑定到Android应用的主线程的Looper上,这个Looper生命周期是伴随着应用的,如果Looper没有处理完Handler发出的消息,那么Handler对象就不会被释放。通常的写法是把Handler作为一个Activity的内部类,如果Handler不是静态的内部类,他就会持有外部类的引用,Handler不被释放时,它所持有的外部类也不会被回收。
一般的解决方法有两种:
①在子线程中使用Handler,自己创建一个Looper,这时候Looper对象的生命周期就是可以控制的。
②Handler声明为静态内部类,静态内类不会持有外部类的引用。这个方法时比较常见,因为代价更小一些。
3、正确使用Context
Context的种类:
①Application,Android应用中默认是单例类,在Activity或者Service中通过getApplication取到,通过context.getApplicationContext()取到应用全局唯一的Context。
②Activity/Service,这两个类都是ContextWrapper的子类,可以通过getBaseContext()取到。不同的Activity/Service的Context是独立的,不会复用。
③BroadcastReceiver,BroadcastReceiver本身并不是Context的子类,是在执行onReceive()方法时由Android框架传入一个Context实例。这个Context是阉割了部分功能,不能调用registerReceiver()跟bindService()两个方法。具体的大家可以看下源码的机制。
④ContentProvider,ContentProvider也不是Context的子类,在创建时由系统传入一个Context实例,可以通过getContext()取到,如果调用者跟ContentProvider在一个应用进程中,返回的是应用全局唯一的Context,如果是其他进程调用的话,ContentProvider持有自身所在进程的Context。
Context最常见的错误使用是实现单例模式时使用Context。这个Context应该使用全局唯一的Context。下图反应了Context提供的功能:
4、掌握Java的四种引用方式
Java的四种引用方式:
①强引用,Java里最常见的应用,也是对象的默认引用方式。如果一个对象具有强引用,垃圾回收不会对其进行回收操作,内存不足直接OOM。
②软引用,当内存充足时不会被回收,内存不足会被回收。软引用可以用来实现内存敏感的高速缓存。可以配合ReferenceQueue使用,被垃圾回收后JVM会把它加入到关联的引用队列中。
③弱引用,只有弱引用的对象的生命周期更短,不论当前内存是否充足,垃圾回收机制扫描到弱引用的对象都会回收。也可以配合ReferenceQueue使用,被垃圾回收后JVM会把它加入到关联的引用队列中。
④虚引用,对象会按原来的方式被回收,虚引用本质上是一个标记。虚引用必须跟ReferenceQueue配合使用,被垃圾回收后JVM会把它加入到关联的引用队列中。
5、其他的代码优化
●避免创建非必要的对象。
●对常量使用staticfinal修饰
●避免内部的getter/setter
●合理的代码重构
二、图片优化
图片的加载与显示几乎是每个应用都避免不了的问题,对于图片重度依赖的应用,图片的处理会影响到整个App的用户体验。
1、图片格式
Android应用中能使用的编码格式有三种:JPEG、PNG、WebP,图片格式可以通过查看Bitmap的CompressFormat枚举值来确定。
①JPEG,广泛使用的有损压缩,三通道,RPG,不支持透明与多帧,通过控制压缩比可以调整图片大小。
②PNG,是一种无损压缩图片格式,四通道,ARPG,PNG占用空间比较大,应用瘦身可以对PNG进行处理减小其体积。
③WebP,google在年发布的,支持有损、无损压缩,支持完整透明通道,也支持多帧动画,是一种比较理想的格式。既保证图片质量,又要限制图片大小,WebP是首选。