因为Android本身的限制,在2.x版中使用 Bitmap 只要遇到稍大一点的图,很容易就会遇到 out of memory 的状况,在经过一阵搜寻之后,一直没有很好的方法,有很多网站介绍的方法是把原图 subsample,但对于图片quality有要求的程序来说,这可是不被接受的解法,搞了半天,最后只好直接把 Android 的 source code 拿出来瞧瞧看看是否有什么机会解决这个问题,突然发现原来这个问题竟然有个投机取巧的解决方法。

目前在网站上找到的结果,效果最有效的是使用

BitmapFactory.Options

将里面的 inPurgeable 设定为 true,这样可以让java系统内存不足时先行回收部分的内存,这个方法其实已经解决大部分的问题了,不过生出来的内存还是算在java 的VM里总是有些美中不足。

在看了source code 之后,我发现在BitmapFactory.Options里竟然有一个inNativeAlloc的public变量,可以直接不把使用的内存算到VM里,有趣的是这个变量是个隐藏版的变量,所以在正常的SDK文件中看不到,用eclipse时也不会提示你,也不能直接用,因此我用了一些小技巧将这个变量设成true,如此一来bitmap out of memory的问题发生的机率又更低了,以下就是目前的程序代码,有需要的人可以参考一下,不过不管怎么样,bitmap这东西,只要不用了,还是请尽量将它recycle,不然再多内存也是不够用地~

public Bitmap decodeFile(String filePath){ Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try {BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(mFilePath != null) { bitmap = BitmapFactory.decodeFile(mFilePath, options); } return bitmap;} 

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android中dispatchDraw分析
  7. Android四大基本组件介绍与生命周期
  8. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. 详解 Android(安卓)的 Activity 组件
  2. 从零开始学习android
  3. 全网最全的Android资源汇总
  4. android 重用 c代码
  5. android studio 中一些比较好的插件
  6. 系出名门Android(4) - 活动(Activity),
  7. Android(安卓)HDMI( 三)
  8. Android中TextVIew一些属性
  9. Android(安卓)支持多屏幕机制
  10. Android(安卓)中文 API (102)—— CursorAd