android 性能优化
android性能优化在实际开发中会经常应用到,当项目越来越庞大时,性能优化就显得更加重要,写出高性能优化代码不但需要丰富的经验,而且还需要了解其原理,这样才有助于我们写出高性能的代码,今天我们来总结一下日常开发中常用性能优化方案,看看你都熟悉哪些。 android
性能优化包括:布局优化、绘制优化、内存泄漏优化、响应速度优化、listview
优化、Bitmap
优化、线程优化等。
布局优化
尽量减少布局层级,relativeLayout
比LinearLayout
的性能差,relativeLayout
的性能优于嵌套布局,布局优化的另外一个手段就是采用<include>
、<merge>
标签和ViewStub
,<include>
标签主要用于布局重用,<merge>
标签一般和<include>
标签去配合使用,它可以降低减少布局的层级,而ViewStub
则提供了按需加载的功能,当需要时才会将ViewStub
中的布局加载到内存中,这提高了程序的初始化效率。
绘制优化
绘制优化指View的onDraw
方法要避免执行大量的操作,这主要体现在两个方面:
(1)onDraw
方法中不要创建新的局部对象,因为onDraw
方法可能被频繁的调用,这样一瞬间会产生大量的临时对象,这些对象不仅占用了过多的内存,而且还会导致系统频繁的gc
,降低了程序的执行效率。
(2)onDraw
方法中不要执行耗时任务,也不能执行成千上万次的循环操作,大量的循环十分抢占CPU
的时间片,这会造成view
的绘制过程不流畅。
内存泄漏优化
内存泄漏优化分为两个方面:
(1)避免写出内存泄漏的代码、
(2)通过分析工具,比如MAT来找出潜在的内存泄漏继而解决。
内存泄漏场景:
(1)静态变量导致的内存泄漏
(2)单例模式导致的内存泄漏
(3)属性动画导致的内训泄漏:属性动画中有一种无限循环的动画,它持有Activity
中View
的引用,而View
又持有Activity
,这样就导致Activity
已经不显示了,但是仍然销毁不掉,解决方案就是在Activity
的onDestroy()
方法中将动画停止。
响应速度优化
避免在主线程中去做耗时操作,Activity
如果5s没有响应,则会出现ANR
,BroadcastReceiver
如果
10s还未执行完操作也会出现ANR
。
ListView和Bitmap优化
listView
优化主要分为三个方面:
(1)使用ViewHolder
并避免在getView
方法中执行耗时操作
(2)根据列表的滑动状态来控制任务的执行频率,比如当列表快速滑动时不适合开启大量的异步任务,
(3)使用硬件加速来使listView
的滑动更加流畅
Bitmap
优化:
主要是通过BitmapFactory.Options
来根据需要对图片进行采样,采样的过程主要使用到了BitmapFactory.Options
来根据需要对图片进行采样,采样的过程主要使用到了BitmapFactory.Options
的inSampleSize
参数
线程优化
线程优化的思想是采用线程池,避免程序中存在大量的Thread
。线程池可以重用内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时线程池可以有效的控制线程的最大并发数,避免了大量线程因互相抢占系统资源而导致阻塞现象的发生。因此在实际开发中应尽量采用线程池,而不是每次都要创建一个Thread
对象。
一些性能优化的建议
(1)避免创建过多的对象
(2)不要过多的使用枚举类型,枚举占用的内存空间比整型要大
(3)常量请使用static final
来修饰
(4)使用一些android
也有的数据结构,如SparseArray
和Pair
(5)适当的使用软引用和弱引用
(6)采用内存缓存和磁盘缓存
(7)尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏的问题