因为Android的应用程序最大内存值有限,Android虽然会自动管理内存,但是如果程序在一次操作中打开几个M的文件或图片,那么通常会出现下面的错误信息。

1920000-byte external allocation too large for this process.

java.lang.OutOfMemoryError: bitmap size exceeds VM budget

解决方法:

1.明确调用System.gc();

这种内存回收会有一定的作用,但是请不要太期待。

2.图片处理完成后回收内存。

请在调用BitMap进行图片处理后进行内存回收。

bitmap.recycle();

这样会把刚刚用过的图片占用的内存释放。

3.图片处理时指定大小。

下面这个方法处理几个M的图片时是必须的

  1. BitMap getBitpMap(){
  2. ParcelFileDescriptor pfd;
  3. try{
  4. pfd = mCon.getContentResolver().openFileDescriptor(uri, "r");
  5. }catch (IOException ex){
  6. returnnull;
  7. }
  8. java.io.FileDescriptor fd = pfd.getFileDescriptor();
  9. BitmapFactory.Options options = new BitmapFactory.Options();
  10. //先指定原始大小
  11. options.inSampleSize = 1;
  12. //只进行大小判断
  13. options.inJustDecodeBounds = true;
  14. //调用此方法得到options得到图片的大小
  15. BitmapFactory.decodeFileDescriptor(fd, null, options);
  16. //我们的目标是在800pixel的画面上显示。
  17. //所以需要调用computeSampleSize得到图片缩放的比例
  18. options.inSampleSize = computeSampleSize(options, 800);
  19. //OK,我们得到了缩放的比例,现在开始正式读入BitMap数据
  20. options.inJustDecodeBounds = false;
  21. options.inDither = false;
  22. options.inPreferredConfig = Bitmap.Config.ARGB_8888;
  23. //根据options参数,减少所需要的内存
  24. Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null, options);
  25. return sourceBitmap;
  26. }
  27. //这个函数会对图片的大小进行判断,并得到合适的缩放比例,比如2即1/2,3即1/3
  28. staticint computeSampleSize(BitmapFactory.Options options, int target) {
  29. int w = options.outWidth;
  30. int h = options.outHeight;
  31. int candidateW = w / target;
  32. int candidateH = h / target;
  33. int candidate = Math.max(candidateW, candidateH);
  34. if (candidate == 0)
  35. return1;
  36. if (candidate > 1) {
  37. if ((w > target) && (w / candidate) < target)
  38. candidate -= 1;
  39. }
  40. if (candidate > 1) {
  41. if ((h > target) && (h / candidate) < target)
  42. candidate -= 1;
  43. }
  44. if (VERBOSE)
  45. Log.v(TAG, "for w/h " + w + "/" + h + " returning " + candidate + "(" + (w/candidate) + " / " + (h/candidate));
  46. return candidate;
  47. }

4、修改Android应用程序的默认最大内存值。具体修改方法,可参考:http://www.ziyouku.com/archives/android-applications-to-modify-the-default-maximum-memory-value.html

更多相关文章

  1. Android异步加载图片
  2. Android对图片局部扩大的实现
  3. Android下获取手机屏幕大小
  4. android webview字体大小的控制
  5. Android的AnimationSet动画实现图片的轮播,移动和切换可以自定义
  6. 在android中创建bitmap避免内存不足的方法

随机推荐

  1. vue指令v-html和v-text
  2. SpringBoot全局异常处理方式
  3. 程序员有必要拥有一台自己的云服务器吗?为
  4. 意派Epub360丨快来制作圣诞节营销H5小游
  5. 部署小程序的云服务器要注意什么?配置过程
  6. 简易 javascript 日历
  7. JS,CSS HTML 简单开心日历
  8. 购物车和订单页
  9. echarts移动端的适配思路
  10. localStorage使用