




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Bitmap詳解與Bitmap的內(nèi)存優(yōu)化一、Bitmap:Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。常用方法:+publicvoidrecycle()//回收位圖占用的內(nèi)存空間,把位圖標(biāo)記為Dead+publicfinalbooleanisRecycled()〃判斷位圖內(nèi)存是否已釋放+publicfinalintgetWidth()//獲取位圖的寬度+publicfinalintgetHeight()〃獲取位圖的高度+publicfinalbooleanisMutable()〃圖片是否可修改+publicintgetScaledWidth(Canvascanvas)//獲取指定密度轉(zhuǎn)換后的圖像的寬度+publicintgetScaledHeight(Canvascanvas)//獲取指定密度轉(zhuǎn)換后的圖像的高度+publicbooleancompress(CompressFormatformat,intquality,OutputStreamstream)〃按指定的圖片格式以及畫質(zhì),將圖片轉(zhuǎn)換為輸出流。format:壓縮圖像的格式,如Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEGquality:畫質(zhì),0-100.0表示最低畫質(zhì)壓縮,100以最高畫質(zhì)壓縮。對(duì)于PNG等無損格式的圖片,會(huì)忽略此項(xiàng)設(shè)置。stream:OutputStream中寫入壓縮數(shù)據(jù)。return:是否成功壓縮到指定的流。+publicstaticBitmapcreateBitmap(Bitmapsrc)〃以src為原圖生成不可變得新圖像+publicstaticBitmapcreateScaledBitmap(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter)〃以src為原圖,創(chuàng)建新的圖像,指定新圖像的高寬以及是否可變。+publicstaticBitmapcreateBitmap(intwidth,intheight,Configconfig)〃創(chuàng)建指定格式、大的位圖+publicstaticBitmapcreateBitmap(Bitmapsource,intx,inty,intwidth,intheight)〃以source為原圖,創(chuàng)建新的圖片,指定起始坐標(biāo)以及新圖像的高寬。二、BitmapFactory工廠類:Option參數(shù)類:+publicbooleaninJustDecodeBounds//如果設(shè)置為true,不獲取圖片,不分配內(nèi)存,但會(huì)返回圖片的高度寬度信息。如果將這個(gè)值置為true,那么在解碼的時(shí)候?qū)⒉粫?huì)返回bitmap,只會(huì)返回這個(gè)bitmap的尺寸。這個(gè)屬性的目的是,如果你只想知道一個(gè)bitmap的尺寸,但又不想將其加載到內(nèi)存時(shí)。這是一個(gè)非常有用的屬性。+publicintinSampleSize〃圖片縮放的倍數(shù)這個(gè)值是一個(gè)int,當(dāng)它小于1的時(shí)候,將會(huì)被當(dāng)做1處理,如果大于1,那么就會(huì)按照比例(1/inSampleSize)縮小bitmap的寬和高、降低分辨率,大于1時(shí)這個(gè)值將會(huì)被處置為2的倍數(shù)。例如,width=100,height=100,inSampleSize=2,那么就會(huì)將bitmap處理為,width=50,height=50,寬高降為1/2,像素?cái)?shù)降為1/4。+publicintoutWidth//獲取圖片的寬度值+publicintoutHeight〃獲取圖片的高度值表示這個(gè)Bitmap的寬和高,一般和inJustDecodeBounds一起使用來獲得Bitmap的寬高,但是不加載到內(nèi)存。+publicintinDensity〃用于位圖的像素壓縮比+publicintinTargetDensity//用于目標(biāo)位圖的像素壓縮比(要生成的位圖)+publicbyte[]inTempStorage〃創(chuàng)建臨時(shí)文件,將圖片存儲(chǔ)+publicbooleaninScaled〃設(shè)置為true時(shí)進(jìn)行圖片壓縮,從inDensity至UinTargetDensity+publicbooleaninDither//如果為true,解碼器嘗試抖動(dòng)解碼+publicBitmap.ConfiginPreferredConfig〃設(shè)置解碼器這個(gè)值是設(shè)置色彩模式,默認(rèn)值是ARGB_8888,在這個(gè)模式下,一個(gè)像素點(diǎn)占用4bytes空間,一般對(duì)透明度不做要求的話,一般采用RGB_565模式,這個(gè)模式下一個(gè)像素點(diǎn)占用2bytes。+publicStringoutMimeType//設(shè)置解碼圖像+publicbooleaninPurgeable〃當(dāng)存儲(chǔ)Pixel的內(nèi)存空間在系統(tǒng)內(nèi)存不足時(shí)是否可以被回收+publicbooleaninInputShareable//inPurgeable為true情況下才生效,是否可以共享一個(gè)InputStream+publicbooleaninPreferQualityOverSpeed〃為true則優(yōu)先保證Bitmap質(zhì)量其次是解碼速度+publicbooleaninMutable〃配置Bitmap是否可以更改,比如:在Bitmap上隔幾個(gè)像素加一條線段+publicintinScreenDensity〃當(dāng)前屏幕的像素密度工廠方法:+publicstaticBitmapdecodeFile(StringpathName,Optionsopts)〃從文件讀取圖片+publicstaticBitmapdecodeFile(StringpathName)+publicstaticBitmapdecodeStream(InputStreamis)〃從輸入流讀取圖片+publicstaticBitmapdecodeStream(InputStreamis,RectoutPadding,Optionsopts)+publicstaticBitmapdecodeResource(Resourcesres,intid)〃從資源文件讀取圖片+publicstaticBitmapdecodeResource(Resourcesres,intid,Optionsopts)+publicstaticBitmapdecodeByteArray(byte口data,intoffset,intlength)〃從數(shù)組讀取圖片+publicstaticBitmapdecodeByteArray(byte口data,intoffset,intlength,Optionsopts)+publicstaticBitmapdecodeFileDescriptor(FileDescriptorfd)〃從文件讀取文件與decodeFile不同的是這個(gè)直接調(diào)用JNI函數(shù)進(jìn)行讀取效率比較高+publicstaticBitmapdecodeFileDescriptor(FileDescriptorfd,RectoutPadding,Optionsopts)*Bitmap.ConfiginPreferredConfig:*枚舉變量(位圖位數(shù)越高代表其可以存儲(chǔ)的顏色信息越多,圖像越逼真,占用內(nèi)存越大)+publicstaticfinalBitmap.ConfigALPHA_8//代表8位Alpha位圖每個(gè)像素占用1byte內(nèi)存+publicstaticfinalBitmap.ConfigARGB_4444〃代表16位ARGB位圖每個(gè)像素占用2byte內(nèi)存+publicstaticfinalBitmap.ConfigARGB_8888〃代表32位ARGB位圖每個(gè)像素占用4byte內(nèi)存+publicstaticfinalBitmap.ConfigRGB_565//代表8位RGB位圖每個(gè)像素占用2byte內(nèi)存Android中一張圖片(BitMap)占用的內(nèi)存主要和以下幾個(gè)因數(shù)有關(guān):圖片長度,圖片寬度,單位像素占用的字節(jié)數(shù)。一張圖片(BitMap)占用的內(nèi)存=圖片長度*圖片寬度*單位像素占用的字節(jié)數(shù)。三、Bitmap加載方式Bitmap的加載方式有Resource資源加載、本地(SDcard)加載、網(wǎng)絡(luò)加載等加載方式。.從本地(SDcard)文件讀取方式一/**獲取縮放后的本地圖片*@paramfilePath文件路徑@paramwidth寬@paramheight高@return/publicstaticBitmapreadBitmapFromFile(StringfilePath,intwidth,intheight){BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeFile(filePath,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);}}options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeFile(filePath,options);}方式二(效率高于方式一)獲取縮放后的本地圖片*@paramfilePath文件路徑@paramwidth寬@paramheight高@return/publicstaticBitmapreadBitmapFromFileDescriptor(StringfilePath,intwidth,intheight)(try(FileInputStreamfis=newFileInputStream(filePath);BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeFileDescriptor(fis.getFD(),null,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);}}options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeFileDescriptor(fis.getFD(),null,options);}catch(Exceptionex){}returnnull;}.從輸入流中讀取文件(網(wǎng)絡(luò)加載)/**獲取縮放后的本地圖片*@paramins輸入流@paramwidth寬@paramheight高@return/publicstaticBitmapreadBitmapFromInputStream(InputStreamins,intwidth,intheight)(BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeStream(ins,null,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);}}options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeStream(ins,null,options);}.Resource資源加載Res資源加載方式:publicstaticBitmapreadBitmapFromResource(Resourcesresources,intresourcesId,intwidth,intheight){BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeResource(resources,resourcesId,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeResource(resources,resourcesId,options);}此種方式相當(dāng)?shù)暮馁M(fèi)內(nèi)存建議采用decodeStream代替decodeResource可以如下形式publicstaticBitmapreadBitmapFromResource(Resourcesresources,intresourcesId,intwidth,intheight){InputStreamins=resources.openRawResource(resourcesId);BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeStream(ins,null,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeStream(ins,null,options);JavaBitmapFactory.decodeResource加載的圖片可能會(huì)經(jīng)過縮放,該縮放目前是放在Java層做的,效率比較低,而且需要消耗java層的內(nèi)存。因此,如果大量使用該接口加載圖片,容易導(dǎo)致OOM錯(cuò)誤BitmapFactory.decodeStream不會(huì)對(duì)所加載的圖片進(jìn)行縮放,相比之下占用內(nèi)存少,效率更高。這兩個(gè)接口各有用處,如果對(duì)性能要求較高,則應(yīng)該使用decodeStream;如果對(duì)性能要求不高,且需要Android自帶的圖片自適應(yīng)縮放功能,則可以使用decodeResourceAssets資源加載方式:/**獲取縮放后的本地圖片@paramfilePath文件路徑,即文件名稱@return/publicstaticBitmapreadBitmapFromAssetsFile(Contextcontext,StringfilePath){Bitmapimage=null;AssetManageram=context.getResources().getAssets();try{InputStreamis=am.open(filePath);image=BitmapFactory.decodeStream(is);is.close();}catch(IOExceptione){e.printStackTrace();}returnimage;}4.從二進(jìn)制數(shù)據(jù)讀取圖片publicstaticBitmapreadBitmapFromByteArray(byte[]data,intwidth,intheight){BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeByteArray(data,0,data.length,options);floatsrcWidth=options.outWidth;floatsrcHeight=options.outHeight;intinSampleSize=1;if(srcHeight>height||srcWidth>width){if(srcWidth>srcHeight){inSampleSize=Math.round(srcHeight/height);}else{inSampleSize=Math.round(srcWidth/width);}}options.inJustDecodeBounds=false;options.inSampleSize=inSampleSize;returnBitmapFactory.decodeByteArray(data,0,data.length,options);}四、Bitmap|Drawable|InputStream|Byte[]之間進(jìn)行轉(zhuǎn)換Drawable轉(zhuǎn)化成BitmappublicstaticBitmapdrawableToBitmap(Drawabledrawable){
Bitmapbitmap=Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity()Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565);Canvascanvas=newCanvas(bitmap);drawable.setBounds(0,0,drawable.getIntrinsicHeight());!=PixelFormat.OPAQUEdrawable.getIntrinsicWidth(),drawableDrawabledrawabledrawable.draw(canvas);returnbitmap;}!=PixelFormat.OPAQUEdrawable.getIntrinsicWidth(),drawableDrawabledrawablegetResources().getDrawable(R.drawable.ic_launcher);Bitmap轉(zhuǎn)換成DrawablepublicstaticDrawablebitmapToDrawable(Resourcesresources,Bitmapbm){Drawabledrawable=newBitmapDrawable(resources,bm);returndrawable;}Bitmap轉(zhuǎn)換成byte[]publicbyte[]bitmap2Bytes(Bitmapbm){ByteArrayOutputStreambaos=newByteArrayOutputStream();press(Bitmap.CompressFormat.PNG,100,baos);returnbaos.toByteArray();}byte[]轉(zhuǎn)換成BitmapBitmapbitmap=BitmapFactory.decodeByteArray(byte,0,b.length);InputStream轉(zhuǎn)換成BitmapInputStreamis=getResources().openRawResource(id);Bitmapbitmap=BitmaoFactory.decodeStream(is);InputStream轉(zhuǎn)換成byte[]InputStreamis=getResources().openRawResource(id);〃也可以通過其他方式接收一個(gè)InputStream對(duì)象ByteArrayOutputStreambaos=newByteArrayOutputStream。;byte[]b=newbyte[1024*2];intlen=0;while((len=is.read(b,0,b.length))!=-1){baos.write(b,0,len);baos.flush();}byte[]bytes=baos.toByteArray();五、Bitmap簡單操作*將Bitmap保存為本地文件:*publicstaticvoidwriteBitmapToFile(StringfilePath,Bitmapb,intquality){try{FiledesFile=newFile(filePath);FileOutputStreamfos=newFileOutputStream(desFile);BufferedOutputStreambos=newBufferedOutputStream(fos);press(Bitmap.CompressFormat.JPEG,quality,bos);bos.flush();bos.close();}catch(IOExceptione){e.printStackTrace();}}圖片壓縮:privatestaticBitmapcompressImage(Bitmapimage){if(image==null){returnnull;}ByteArrayOutputStreambaos=null;try{baos=newByteArrayOutputStream();press(Bitmap.CompressFormat.JPEG,100,baos);byte[]bytes=baos.toByteArray();ByteArrayInputStreamisBm=newByteArrayInputStream(bytes);Bitmapbitmap=BitmapFactory.decodeStream(isBm);returnbitmap;}catch(OutOfMemoryErrore){}finally{try{if(baos!=null){baos.close();}}catch(IOExceptione){}}returnnull;}圖片縮放:根據(jù)scale生成一張圖片*@parambitmap@paramscale等比縮放值@return/publicstaticBitmapbitmapScale(Bitmapbitmap,floatscale){Matrixmatrix=newMatrix();matrix.postScale(scale,scale);//長和寬放大縮小的比例BitmapresizeBmp=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);returnresizeBmp;}獲取圖片旋轉(zhuǎn)角度:/**讀取照片exif信息中的旋轉(zhuǎn)角度*@parampath照片路徑@return角度/privatestaticintreadPictureDegree(Stringpath){if(TextUtils.isEmpty(path)){return0;}intdegree=0;try{ExifInterfaceexifInterface=newExifInterface(path);intorientationexifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);switch(orientation){caseExifInterface.ORIENTATION_ROTATE_90:degree=90;break;caseExifInterface.ORIENTATION_ROTATE_180:degree=180;break;caseExifInterface.ORIENTATION_ROTATE_270:degree=270;break;}}catch(Exceptione){}returndegree;設(shè)置圖片旋轉(zhuǎn)角度privatestaticBitmaprotateBitmap(Bitmapb,floatrotateDegree){if(b==null){returnnull;)Matrixmatrix=newMatrix();matrix.postRotate(rotateDegree);BitmaprotaBitmap=Bitmap.createBitmap(b,0,0,b.getWidth(),b.getHeight(),matrix,true);returnrotaBitmap;)通過圖片id獲彳導(dǎo)Bitmap:Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);通過assest獲取獲彳DDrawablebitmap:InputStreamin=this.getAssets().open("ic_launcher");Drawableda=Drawable.createFromStream(in,null);Bitmapmm=BitmapFactory.decodeStream(in);通過sdcard獲彳導(dǎo)bitmapBitmapbit=BitmapFactory.decodeFile("/sdcard/android.jpg");*view轉(zhuǎn)Bitmap*publicstaticBitmapconvertViewToBitmap(Viewview,intbitmapWidth,intbitmapHeight){Bitmapbitmap=Bitmap.createBitmap(bitmapWidth,bitmapHeight,Bitmap.Config.ARGB_8888);view.draw(newCanvas(bitmap));returnbitmap;)將控件轉(zhuǎn)換為bitmappublicstaticBitmapconvertViewToBitMap(Viewview){//打開圖像緩存view.setDrawingCacheEnabled(true);//必須調(diào)用measure和layout方法才能成功保存可視組件的截圖到png圖像文件//測量View大小view.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));//發(fā)送位置和尺寸到View及其所有的子Viewview.layout(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());//獲得可視組件的截圖Bitmapbitmap=view.getDrawingCache();returnbitmap;publicstaticBitmapgetBitmapFromView(Viewview){BitmapreturnedBitmap=Bitmap.createBitmap(view.getWidth(),view.getHeight(),Bitmap.Config.ARGB_8888);Canvascanvas=newCanvas(returnedBitmap);DrawablebgDrawable=view.getBackground();if(bgDrawable!=null)bgDrawable.draw(canvas);elsecanvas.drawC010r(Color.WHITE);view.draw(canvas);returnreturnedBitmap;)*放大縮小圖片*publicstaticBitmapzoomBitmap(Bitmapbitmap,intw,inth){intwidth=bitmap.getWidth();intheight=bitmap.getHeight();Matrixmatrix=newMatrix();floatscaleWidht=((float)w/width);floatscaleHeight=((float)h/height);matrix.postScale(scaleWidht,scaleHeight);Bitmapnewbmp=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);returnnewbmp;)獲得圓角圖片的方法publicstaticBitmapgetRoundedCornerBitmap(Bitmapbitmap,floatroundPx){Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);Canvascanvas=newCanvas(output);finalintcolor=0xff424242;finalPaintpaint=newPaint();finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());finalRectFrectF=newRectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0,0,0,0);paint.setColor(color);canvas.drawRoundRect(rectF,roundPx,roundPx,paint);paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap,rect,rect,paint);returnoutput;}對(duì)bitmap進(jìn)行裁剪publicBitmapbitmapClip(Contextcontext,intid,intx,inty){Bitmapmap=BitmapFactory.decodeResource(context.getResources(),id);map=Bitmap.createBitmap(ap,x,y,120,120);returnmap;}六、Bitmap的內(nèi)存優(yōu)化詳解在Android應(yīng)用里,最耗費(fèi)內(nèi)存的就是圖片資源。而且在Android系統(tǒng)中,讀取位圖Bitmap時(shí),分給虛擬機(jī)中的圖片的堆棧大小只有8M,如果超出了,就會(huì)出現(xiàn)OutOfMemory異常。所以,對(duì)于圖片的內(nèi)存優(yōu)化,是Android應(yīng)用開發(fā)中比較重要的內(nèi)容。####1.要及時(shí)回收Bitmap的內(nèi)存Bitmap類有一個(gè)方法recycle。,從方法名可以看出意思是回收。這里就有疑問了,Android系統(tǒng)有自己的垃圾回收機(jī)制,可以不定期的回收掉不使用的內(nèi)存空間,當(dāng)然也包括Bitmap的空間。那為什么還需要這個(gè)方法呢?Bitmap類的構(gòu)造方法都是私有的,所以開發(fā)者不能直接new出一個(gè)Bitmap對(duì)象,只能通過BitmapFactory類的各種靜態(tài)方法來實(shí)例化一個(gè)Bitmap。仔細(xì)查看BitmapFactory的源代碼可以看到,生成Bitmap對(duì)象最終都是通過JNI調(diào)用方式實(shí)現(xiàn)的。所以,加載Bitmap到內(nèi)存里以后,是包含兩部分內(nèi)存區(qū)域的。簡單的說,一部分是Java部分的,一部分是C部分的。這個(gè)Bitmap對(duì)象是由Java部分分配的,不用的時(shí)候系統(tǒng)就會(huì)自動(dòng)回收了,但是那個(gè)對(duì)應(yīng)的C可用的內(nèi)存區(qū)域,虛擬機(jī)是不能直接回收的,這個(gè)只能調(diào)用底層的功能釋放。所以需要調(diào)用recycle。方法來釋放C部分的內(nèi)存。從Bitmap類的源代碼也可以看到,recycle()方法里也的確是調(diào)用了JNI方法了的。那如果不調(diào)用recycle。,是否就一定存在內(nèi)存泄露呢?也不是的。Android的每個(gè)應(yīng)用都運(yùn)行在獨(dú)立的進(jìn)程里,有著獨(dú)立的內(nèi)存,如果整個(gè)進(jìn)程被應(yīng)用本身或者系統(tǒng)殺死了,內(nèi)存也就都被釋放掉了,當(dāng)然也包括C部分的內(nèi)存。Android對(duì)于進(jìn)程的管理是非常復(fù)雜的。簡單的說,Android系統(tǒng)的進(jìn)程分為幾個(gè)級(jí)別,系統(tǒng)會(huì)在內(nèi)存不足的情況下殺死一些低優(yōu)先級(jí)的進(jìn)程,以提供給其它進(jìn)程充足的內(nèi)存空間。在實(shí)際項(xiàng)目開發(fā)過程中,有的開發(fā)者會(huì)在退出程序的時(shí)候使用Process.killProcess(Process.myPid())的方式將自己的進(jìn)程殺死,但是有的應(yīng)用僅僅會(huì)使用調(diào)用Activity.finish()方法的方式關(guān)閉掉所有的Activity。釋放Bitmap的示例代碼片段://先判斷是否已經(jīng)回收if(bitmap!=null&&!bitmap.isRecycled()){//回收并且置為nullbitmap.recycle();bitmap=null;)System.gc();從上面的代碼可以看到,bitmap.recycle()方法用于回收該Bitmap所占用的內(nèi)存,接著將bitmap置空,最后使用System.gc()調(diào)用一下系統(tǒng)的垃圾回收器進(jìn)行回收,可以通知垃圾回收器盡快進(jìn)行回收。這里需要注意的是,調(diào)用System.gc()并不能保證立即開始進(jìn)行回收過程,而只是為了加快回收的到來。如何調(diào)用recycle。方法進(jìn)行回收已經(jīng)了解了,那什么時(shí)候釋放Bitmap的內(nèi)存比較合適呢?一般來說,如果代碼已經(jīng)不再需要使用Bitmap對(duì)象了,就可以釋放了。釋放內(nèi)存以后,就不能再使用該Bitmap對(duì)象了,如果再次使用,就會(huì)拋出異常。所以一定要保證不再使用的時(shí)候釋放。比如,如果是在某個(gè)Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中進(jìn)行回收。.捕獲異常為了避免應(yīng)用在分配Bitmap內(nèi)存的時(shí)候出現(xiàn)OutOfMemory異常以后Crash掉,需要特別注意實(shí)例化Bitmap部分的代碼。通常,在實(shí)仞^化Bitmap的代碼中,一定要對(duì)OutOfMemory異常進(jìn)行捕獲。Bitmapbitmap=null;try{//實(shí)例化Bitmapbitmap=BitmapFactory.decodeFile(path);}catch(OutOfMemoryErrore){//}if(bitmap==null){//如果實(shí)例化失敗返回默認(rèn)的Bitmap對(duì)象returndefaultBitmapMap;}這里對(duì)初始化Bitmap對(duì)象過程中可能發(fā)生的OutOfMemory異常進(jìn)行了捕獲。如果發(fā)生了OutOfMemory異常
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- TCZSYSJLXH 002-2024 全國藝術(shù)行業(yè)職業(yè)能力水平評(píng)價(jià)團(tuán)體標(biāo)準(zhǔn)
- 太原單柱式標(biāo)志桿施工方案
- 吉安市防水補(bǔ)漏施工方案
- 浦東新區(qū)2024學(xué)年度第一學(xué)期期末教學(xué)質(zhì)量檢測高三語文試卷
- 生態(tài)茶園修復(fù)工程施工方案
- 建筑工程竣工驗(yàn)收檢測報(bào)告
- 右安門鋼結(jié)構(gòu)施工方案
- 簡支鋼箱梁橋施工方案
- 酉陽四星級(jí)酒店施工方案
- 陶鋁吸音板施工方案
- 中西醫(yī)結(jié)合規(guī)范化癌痛全程管理 癌痛的中西醫(yī)結(jié)合規(guī)范化治療(一)課件
- 沙棘種植施工方案
- 安 全 旁 站 監(jiān) 理 記 錄 表
- 村衛(wèi)生室醫(yī)療質(zhì)量督導(dǎo)檢查匯總表
- 電子商務(wù)專升本考試(習(xí)題卷12)
- (完整word版)Word信紙(A4橫條直接打印版)模板
- 雨水管道水力計(jì)算表
- (完整版)《西游記》競賽題目100題
- 困境兒童走訪調(diào)查表、致困原因確定參考標(biāo)準(zhǔn)、困境兒童評(píng)估報(bào)告
- 電機(jī)學(xué)同步電機(jī)-全套課件
- 農(nóng)產(chǎn)品電商營銷與運(yùn)營PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論