android 图片内存溢出解决方案.docx_第1页
android 图片内存溢出解决方案.docx_第2页
android 图片内存溢出解决方案.docx_第3页
android 图片内存溢出解决方案.docx_第4页
android 图片内存溢出解决方案.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:?123BitmapFactory.Options opts = newBitmapFactory.Options();opts.inSampleSize = 4;Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);如何设置恰当的inSampleSize设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。?123BitmapFactory.Options opts = newBitmapFactory.Options();opts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。查看Android源码,Android提供了一种动态计算的方法。?12345678910111213141516171819202122232425262728293031323334353637383940414243publicstaticintcomputeSampleSize(BitmapFactory.Options options,intminSideLength, intmaxNumOfPixels) intinitialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);introundedSize;if(initialSize = 8) roundedSize = 1;while(roundedSize initialSize) roundedSize = 1; elseroundedSize = (initialSize + 7) / 8* 8;returnroundedSize;privatestaticintcomputeInitialSampleSize(BitmapFactory.Options options,intminSideLength, intmaxNumOfPixels) doublew = options.outWidth;doubleh = options.outHeight;intlowerBound = (maxNumOfPixels = -1) ? 1:(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels);intupperBound = (minSideLength = -1) ? 128:(int) Math.min(Math.floor(w / minSideLength),Math.floor(h / minSideLength);if(upperBound lowerBound) / return the larger one when there is no overlapping zone.returnlowerBound;if(maxNumOfPixels = -1) &(minSideLength = -1) return1; elseif(minSideLength = -1) returnlowerBound; elsereturnupperBound; 使用该算法,就可动态计算出图片的inSampleSize。?1234567891011BitmapFactory.Options opts = newBitmapFactory.Options();opts.inJustDecodeBounds = true;BitmapFactory.decodeFile(imageFile, opts);opts.inSampleSize = computeSampleSize(opts, -1, 128*128); opts.inJustDecodeBounds = false;tryBitmap bmp = BitmapFactory.decodeFile(imageFile, opts);imageView.setImageBitmap(bmp); catch(OutOfMemoryError err) 另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。获取缩略图关键代码byte imageByte=getImageFromURL(urlPathi.trim();/以下是把图片转化为缩略图再加载BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true; /首先设置.inJustDecodeBounds为trueBitmap bitmap=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length, options); /这时获取到的bitmap是null的,尚未调用系统内存资源options.inJustDecodeBounds = false; 得到图片有宽和高的options对象后,设置.inJustDecodeBounds为 be = (int)(options.outHeight / (float)200); if (be = 0) be = 1; options.inSampleSize = be; /计算得到图片缩小倍数bitmapsi=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length,options); /获取真正的图片对象(缩略图)/* *根据图片网络地址获取图片的byte类型数据*paramurlPath图片网络地址*return图片数据 */ 1. publicbytegetImageFromURL(StringurlPath)2. bytedata=null;3. InputStreamis=null;4. HttpURLConnectionconn=null;5. try6. URLurl=newURL(urlPath);7. conn=(HttpURLConnection)url.openConnection();8. conn.setDoInput(true);9. /conn.setDoOutput(true);10. conn.setRequestMethod(GET);11. conn.setConnectTimeout(6000);12. is=conn.getInputStream();13. if(conn.getResponseCode()=200)14. data=readInputStream(is);15. 16. elseSystem.out.println(发生异常!);17. 18. catch(MalformedURLExceptione)19. e.printStackTrace();20. catch(IOExceptione)21. e.printStackTrace();22. 23. finally24. conn.disconnect();25. try26. is.close();27. catch(IOExceptione)28. e.printStackTrace();29. 30. 31. returndata;32. 33. 34. /*35. *读取InputStream数据,转为byte数据类型36. *paramisInputStream数据37. *return返回byte数据38. */39. publicbytereadInputStream(InputStreamis)40. ByteArrayOutputStreambaos=newByteArrayOutputStream();41. bytebuffer=newbyte1024;42. intlength=-1;43. try44. while(length=is.read(buffer)!=-1)45. baos.write(buffer,0,length);46. 47. baos.flush();48. catch(IOExceptione)49. e.printStackTrace();50. 51. bytedata=baos.toByteArray();52. try53. is.close();54. baos.close();55. catch(IOExceptione)56. e.printStackTrace();57. 58. returndata;59. 60. 61. /*62. *根据网络图片地址集批量获取网络图片63. *paramurlPath网络图片地址数组64. *return返回Bitmap数据类型的数组65. */66. publicBitmapgetBitmapArray(StringurlPath)67. intlength=urlPath.length;68. if(urlPath=null|length1)69. returnnull;70. 71. else72. Bitmapbitmaps=newBitmaplength;73. for(inti=0;ilength;i+)74. byteimageByte=getImageFromURL(urlPathi.trim();75. 76. /以下是把图片转化为缩略图再加载77. BitmapFactory.Optionsoptions=newBitmapFactory.Options();78. options.inJustDecodeBounds=true;79. Bitmapbitmap=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论