java.lang.OutOfMemoryError:bitmapsizeexceedsVMbudget解决方法用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:?123BitmapFactory.Optionsopts=newBitmapFactory.Options();opts.inSampleSize=4;Bitmapbitmap=BitmapFactory.decodeFile(imageFile,opts);如何设置恰当的inSampleSize设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。?123BitmapFactory.Optionsopts=newBitmapFactory.Options();opts.inJustDecodeBounds=true;Bitmapbitmap=BitmapFactory.decodeFile(imageFile,opts);设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。查看Android源码,Android提供了一种动态计算的方法。?12345678910111213141516171819publicstaticintcomputeSampleSize(BitmapFactory.Optionsoptions,intminSideLength,intmaxNumOfPixels){intinitialSize=computeInitialSampleSize(options,minSideLength,maxNumOfPixels);introundedSize;if(initialSize<=8){roundedSize=1;while(roundedSize<initialSize){roundedSize<<=1;}}else{roundedSize=(initialSize+7)/8*8;}returnroundedSize;}privatestaticintcomputeInitialSampleSize(BitmapFactory.Optionsoptions,---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---202122232425262728293031323334353637383940414243intminSideLength,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){//returnthelargeronewhenthereisnooverlappingzone.returnlowerBound;}if((maxNumOfPixels==-1)(minSideLength==-1)){return1;}elseif(minSideLength==-1){returnlowerBound;}else{returnupperBound;}}使用该算法,就可动态计算出图片的inSampleSize。?1234567891011BitmapFactory.Optionsopts=newBitmapFactory.Options();opts.inJustDecodeBounds=true;BitmapFactory.decodeFile(imageFile,opts);opts.inSampleSize=computeSampleSize(opts,-1,128*128);opts.inJustDecodeBounds=false;try{Bitmapbmp=BitmapFactory.decodeFile(imageFile,opts);imageViesetImageBitmap(bmp);}catch(OutOfMemoryErrorerr){}另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。获取缩略图关键代码---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---byte[]imageByte=getImageFromURL(urlPath[i].trim());//以下是把图片转化为缩略图再加载BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;//首先设置.inJustDecodeBounds为trueBitmapbitmap=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);//这时获取到的bitmap是null的,尚未调用系统内存资源options.inJustDecodeBounds=false;得到图片有宽和高的options对象后,设置.inJustDecodeBounds为false。intbe=(int)(options.outHeight/(float)200);if(be<=0)be=1;options.inSampleSize=be;//计算得到图片缩小倍数bitmaps[i]=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);//获取真正的图片对象(缩略图)/***根据图片网络地址获取图片的byte[]类型数据*@paramurlPath图片网络地址*@return图片数据*/1.publicbyte[]getImageFromURL(Strin...