Android内存优化

性能优化篇

Posted by Sai on September 22, 2015

对象优化

  • 避免创建不必要对象

最常见的例子就是当你要频繁操作一个字符串时,使用StringBuffer代替String。 对于所有所有基本类型的组合:int数组比Integer数组好,这也概括了一个基本事实,两个平行的int数组比 (int,int)对象数组性能要好很多。 总体来说,就是避免创建短命的临时对象。减少对象的创建就能减少垃圾收集,进而减少对用户体验的影响。

  • 注意关闭或注销

Cursor广播,File等关闭,Service处理完任务后应当关闭,如果不是常驻的Service,可以使用IntentService代替。还有存在很多需要registerunregister的监听器,我们需要确保在合适的时候及时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 ContextActivity关闭后注意要停止Handler的执行。 线程和static对象使用不当也会导致对象泄漏,特别留意单例对象中不合理的持有。

优化布局

优化布局层次,减少布局嵌套和复杂度。 谨慎使用依赖注入框架,虽然代码是简化了不少。然而,那些注入框架会通过扫描你的代码执行许多初始化的操作,这会导致你的代码需要大量的内存空间来mapping代码,而且mapped pages会长时间的被保留在内存中。除非真的很有必要,建议谨慎使用这种技术。