在Android开发中,特别是一些图片数量特别大特别多的项目中,经常会遇到OOM也就是OutOfMemoryError,那么我们在实际的android开发内存优化中如何有效避免oom呢?
一.上面说到图片多的应用容易发生oom,这里就要提到一个内存优化必须提到的吃内存的大胖子bitmap,通常我们在开发中通过下面两种方式来优化
1.在图片载入内存之前计算合适的缩放比例,避免大图的载入浪费内存
2.使用更加节省内存的解码方式,ARGB_8888比RBG_565所需的内存要大一倍
3.bitmap要及时回收
二.在数据结构上
1.减少内存的开销要尽量使用更加轻量型的数据结构,我们要优先考虑android专用的ArrayMap和SparseArray数据结构而不是HashMap等传统型的数据结构,传统型数据结构效率低下更占内存
2.在android开发中要避免使用Enum,也就是枚举
3.在字符串拼接中尽量使用StringBuilder而不是"+"
三.在向res里添加图片资源时,尺寸,大小,清晰度都要考虑,力争适合的尺寸,小的占存好的清晰度
四.直接引用android本身内置的资源
Android系统本身内置了很多的资源,例如字符串/颜色/图片/动画/样式以及简单布局等等,这些资源都可以在应用程序中直接引用。这样做不仅仅可以减少应用程序的自身负重,减小APK的大小,另外还可以一定程度上减少内存的开销,复用性更好。但是也有必要留意Android系统的版本差异性,对那些不同系统版本上表现存在很大差异,不符合需求的情况,还是需要应用程序自身内置进去。
五.列表控件的使用
列表控件的使用优化listview,gridview,recyclerview等 使用viewholder对convertview的复用等
六.避免对象的内存泄漏
使用leakcanary等第三方开源控件对APP内存泄漏的检测
1.能使用application的context就不要使用activity的context,可以避免activity不能释放而导致的泄漏
2.webview的泄漏问题在android比较严重,因为碎片化严重,不同版本不同厂家的webview都有差别,这里提供一个解决webview泄漏的方案//www.jianshu.com/p/bb778d5959e2
3.操作数据库时会用到cursor对象,cursor对象一定要及时关闭否则会泄露
七.优化布局层次
优化布局层次,减少内存消耗,越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。
八.谨慎使用依赖注入框架和第三方library,这些都会增大内存的消耗
热点新闻