前提:

在Android2.3.3(APILevel10)以及之前,Bitmap的backingpixel数据存储在nativememory,与Bitmap本身是分开的,Bitmap本身存储在dalvikheap中。导致其pixel数据不能判断是否还需要使用,不能及时释放,容易引起OOM错误。从Android3.0(API11)开始,pixel数据与Bitmap一起存储在Dalvikheap中。

结论:

如何处理图片来避免OOM异常:

1.在Android2.3.3以及之前,建议使用Bitmap.recycle()方法,及时释放资源。

2.设置Options.inPreferredConfig值来降低内存消耗 //如把默认值ARGB_8888改为RGB_565,节约一半内存

3.设置Options.inSampleSize对大图片进行压缩

4.设置Options.inPurgeable和inInputShareable:让系统能及时回收内存。

1)inPurgeable:设置为True时,表示系统内存不足时可以被回收,设置为False时,表示不能被回收。

2)inInputShareable:设置是否深拷贝,与inPurgeable结合使用,inPurgeable为false时,该参数无意义True:shareareferencetotheinputdata(inputStream,array,etc)。False:adeepcopy。

5.使用decodeStream代替其他decodeResource,setImageResource,setImageBitmap等方法:

//decodeStream直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,也不使用java空间进行分辨率适配,虽节省dalvik内存,但需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量)。其他方法如setImageBitmap、setImageResource、BitmapFactory.decodeResource在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

6.通过程序设定手动干涉GC处理,增强堆内存处理效率,在程序onCreate时:

private final static floatTARGET_HEAP_UTILIZATION = 0.75f;

VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

7.自定义堆内存大小:
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

8.基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。这点比较有意思的是Google 推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的;





更多相关文章

  1. [置顶] activity配置信息详解
  2. Android(安卓)内存优化总结&实践
  3. Android(安卓)Rect 的使用以及与RectF的区别
  4. Android性能分析工具--Android(安卓)Monitor
  5. Android简单发送邮件(可带附件)
  6. Android(安卓)ApiDemo学习(四)Views——1 animation
  7. Android开发学习之WallPaper设置壁纸详细介绍与实例
  8. Android仿酷狗音乐SeekBar——样式篇
  9. Android程序如何全屏显示

随机推荐

  1. Android(安卓)tcpdump 抓包
  2. TabWidget/TabHost的两种使用方法
  3. [转」 在Linux上开发Android,装手机驱动
  4. Android(安卓)studio使用androidannotati
  5. Android(安卓)Dialog的四种情况
  6. 开启Android程序时检测网络与GPS是否打开
  7. android Widgets
  8. Mac系统cocos2dx + android 开发环境配置
  9. Android全屏显示的两种方式
  10. Maven + Eclipse + Android(安卓)环境搭