对象优化
- 避免创建不必要对象
最常见的例子就是当你要频繁操作一个字符串时,使用StringBuffer
代替String
。
对于所有所有基本类型的组合:int
数组比Integer
数组好,这也概括了一个基本事实,两个平行的int
数组比 (int,int)
对象数组性能要好很多。
总体来说,就是避免创建短命的临时对象。减少对象的创建就能减少垃圾收集,进而减少对用户体验的影响。
- 注意关闭或注销
Cursor
,广播
,File
等关闭,Service
处理完任务后应当关闭,如果不是常驻的Service,可以使用IntentService
代替。还有存在很多需要register
与unregister
的监听器,我们需要确保在合适的时候及时unregister那些监听器。自己手动add的listener,需要记得及时remove这个listener。
- 对象的重复利用
利用对象池将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用。例如图片缓存库常见的,通过Lru算法
缓存常用的图片对象,下次使用的时候从缓存中提取。
在ListView/GridView
等出现大量重复子组件的视图里面对ConvertView
的复用。
- 对象引用类型
引用分为四种级别,这四种级别由高到低依次为:强引用>软引用>弱引用>虚引用,根据情况使用。
- 避免在
onDraw
方法里面执行对象的创建
类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。
bitmap优化
内存优化中最常见的是对bitmap的处理,很多OOM
问题都是由于bitmap操作不当而产生的。
- 减小
Bitmap
对象的内存占用
Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用可谓是重中之重,通常来说有以下2个措施:
inSampleSize:缩放比例,在把图片载入内存之前,我们可以通过BitmapOptions
读取原图的宽高度,然后计算出一个合适的缩放比例,避免不必要的大图载入。
decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
- .9.png
一些重复拉伸的背景,可以使用.9.png
格式,尽量把图缩小只留一小部分区域。
- 临时Bitmap对象的及时回收
虽然在大多数情况下,我们会对Bitmap增加缓存机制,但是在某些时候,部分Bitmap是需要及时回收的。例如临时创建的某个相对比较大的bitmap对象,在经过变换得到新的bitmap对象之后,已经没用的bitmap应该recycle
,这样能够更快释放原始bitmap所占用的空间。
避免内存泄漏
尽量使用Application Context
而不是Activity Context
。
Activity
关闭后注意要停止Handler
的执行。
线程和static
对象使用不当也会导致对象泄漏,特别留意单例对象中不合理的持有。
优化布局
优化布局层次,减少布局嵌套和复杂度。 谨慎使用依赖注入框架,虽然代码是简化了不少。然而,那些注入框架会通过扫描你的代码执行许多初始化的操作,这会导致你的代码需要大量的内存空间来mapping代码,而且mapped pages会长时间的被保留在内存中。除非真的很有必要,建议谨慎使用这种技术。