《Android高级进阶》学习笔记
第5篇 性能优化篇
第33章:代码优化
1、数据结构的选择
SparseArray是Android平台特有的稀疏数组的实现,它是Integer到Object的一个映射,在特定场合可用于替代HashMap<Integer, <E>>,以提高性能。它的核心实现是二分查找算法。
SparseArray有以下四类:
SparseBooleanArray //用于替代HashMap<Integer, Boolean>
SparseIntArray //用于替代HashMap<Integer, Integer>
SparseLongArray //用于替代HashMap<Integer, Long>
SparseArray<String> //用于替代HashMap<Integer, String>
SparseArray不是线程安全的。
由于要进行二分查找,SparseArray会对插入的数据按照Key值大小顺序插入。
SparseArray对删除做了优化,它并不会立即删除这个元素,而是通过设置标识位(DELETE)的方式,后面尝试使用。
2、Handler和内部类的正确用法
Handler
是和Looper
以及MessageQueue
一起工作的。在Android中,一个应用启动后,系统会默认创建一个为主线程服务的Looper对象,该Looper对象用于处理主线程的所有Message对象,它的生命周期贯穿于整个应用的生命周期。在主线程中使用的Handler都会默认绑定到这个Looper对象。在主线程中创建Handler对象时,它会立即关联主线程Looper对象的MessageQueue,这时发送到MessageQueue中的Message对象都会持有这个Handler对象的引用,这样在Looper处理消息时才能回调到Handler的handleMessage方法。
在Activity内,应将Handler声明为静态内部类,而不是非静态匿名内部类,否则会造成内存泄露,因为非静态匿名内部类会持有外部类的一个隐式的引用,而静态内部类不会持有外部类的引用。
3、Context
的种类
根据Context所依托的组件以及用途不同,可以将Context分为以下几种:
Application:Android应用中默认的单例类
Activity/Service:这两个类都是ContextWrapper的子类
BoadcastReceiver:不是Context的子类
ContentProvider:不是Context的子类
4、Java的四种引用方式
强引用(Strong Reference):Java里最广泛使用的一种,也是对象默认的引用类型。如果一个对象具有强引用,那么垃圾回收器不会对它进行回收操作。如果内从空间不足,则会抛出OutOfMemoryError错误。
软引用(Soft Reference):内容空间足够时,不会回收;内从空间不足时,才会被回收。如果配合引用队列(ReferenceQueue)使用,当软引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个软引用加入到与之关联的引用队列中。
软引用可以用来实现内存敏感的高速缓存。弱引用(Weak Reference):无论内存空间是否充足,当垃圾回收器扫描到具有弱引用的对象时,都将进行回收。弱引用也可和一个引用队列配合使用,当弱引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个弱引用加入到与之关联的引用队列中。
弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用虚引用(Phantom Reference):本质上是一个标记引用,主要用来跟踪对象被垃圾回收的活动,虚引用必须和引用队列配合使用。当虚引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个虚引用加入到与之关联的引用队列中。
第34章:图片优化
1、图片的格式
Android平台原生支持的图片格式有:JPEG、PNG、GIF、BMP和WebP(Android 4.0开始),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG、PNG和WebP。
2、9Patch格式
左边代表图片垂直拉伸的区域,上边代表水平拉伸区域,右边代表内容绘制的垂直区域,下边代表内容绘制的水平区域。右边和下边的线是可选的,左边和上边的线不能省略。本质上仍然是PNG格式的图片。
第35章:电量优化
及时取消BroadcastReceiver、定位等功能;
AlarmManager(唤醒操作)间隔不要太短,及时取消;
WakeLock(保持设备唤醒)及时释放锁
第36章:布局优化
1、使用include标签共享布局
2、使用ViewStub标签实现延迟加载
3、使用merge标签减少布局层次#3
4、尽量使用CompoundDrawable
5、使用Lint
第37章:网络优化
1、避免DNS解析
2、合并网络请求
3、预先获取数据
4、避免轮询
5、优化重连机制
6、离线缓存
使用LruCache实现内存缓存,使用DiskLruCache实现外存缓存。
7、压缩数据大小
8、不同的网络环境使用不同##的超时策略
9、CDN的使用
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的环节,使内容传输的更快、更稳定。