转自:http://my.oschina.net/u/169544/blog/54938

0人收藏此文章,我要收藏发表于2天前 , 已有 8次阅读 共 0个评论

因为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. Android(安卓)性能优化工具集合
  2. Android(安卓)Studio 中超级常用的快捷键使用,提高代码编写效率。
  3. Android相机、相册获取图片显示并保存到SD卡
  4. Android(安卓)JNI处理图片实现黑白滤镜的方法
  5. Android有效的治疗方法Bitmap,减少内存
  6. Android中基类BaseActivity的设计与实现
  7. android使用Vitamio实现视频播放大小屏流畅切换
  8. Android朝花夕拾之Debug
  9. 白话Android自定义ListView实现

随机推荐

  1. Android之——申请应用系统管理员权限
  2. Android(安卓)NDK和OpenCV整合开发 (3) O
  3. Android的快速开发框架 afinal
  4. Android开发ContentProvider
  5. android 手机Phone进程下无权限发送短信
  6. Android的线程使用来更新UI----Thread、H
  7. Android(安卓)导读
  8. android:padding和android:margin的区别
  9. Android(安卓)Edittext 开发常见问题总结
  10. Android音乐播放器源码(歌词.均衡器.收藏