您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > android图片内存溢出解决方案
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(roundedSizeinitialSize){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(upperBoundlowerBound){//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);imageView.setImageBitmap(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(StringurlPath){2.byte[]data=null;3.InputStreamis=null;4.HttpURLConnectionconn=null;5.try{6.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.finally{24.conn.disconnect();25.try{26.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.publicbyte[]readInputStream(InputStreamis){40.ByteArrayOutputStreambaos=newByteArrayOutputStream();41.byte[]buffer=newbyte[1024];42.intlength=-1;43.try{44.while((length=is.read(buffer))!=-1){45.baos.write(buffer,0,length);46.}47.baos.flush();48.}catch(IOExceptione){49.e.printStackTrace();50.}51.byte[]data=baos.toByteArray();52.try{53.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.publicBitmap[]getBitmapArray(String[]urlPath){67.intlength=urlPath.length;68.if(urlPath==null||length1){69.returnnull;70.}71.else{72.Bitmap[]bitmaps=newBitmap[length];73.for(inti=0;ilength;i++){74.byte[]imageByte=getImageFromURL(urlPath[i].trim());75.76.//以下是把图片转化为缩略图再加载77.BitmapFactory.Optionsoptions=newBitmapFactory.Options();78.options.inJustDecodeBounds=true;79.Bitmapbitmap=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);80.options.inJustDecodeBounds=false;81.intbe=(int)(options.outHeight/(float)200);82.if(be=0)be=1;83.options.inSampleSize=be;84.bitmaps[i]=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);85.}86.returnbitmaps;87.}88.89.}
本文标题:android图片内存溢出解决方案
链接地址:https://www.777doc.com/doc-2897235 .html