bitmap recycle
Bitmap是Android中一個(gè)非常重要的類(lèi),它用于在內存中繪制圖像(⊙_⊙),當我們使用Bitmap( ?ヮ?)時(shí),需要注意它的生命周期和內存管理,以避免內存泄漏和性能問(wèn)題,本文將詳細介紹Bitmap的回收機制以及何時(shí)會(huì )被釋放。
1、Bitmap的創(chuàng )建與銷(xiāo)毀
在(???)Android中,Bitmap的創(chuàng )建和銷(xiāo)毀是通過(guò)java層的BitmapFactory和Canvas完成的,當( ???)我們通過(guò)BitmapFactory的decode方法從文件或者資源加載一張圖片時(shí),會(huì )創(chuàng )建一個(gè)┐(′ー`)┌Bitmap對象,這個(gè)對象會(huì )在Java堆中分配一塊內存來(lái)存儲圖片的像素數據,當Bitmap不再使用時(shí),我們需要(yao)調用recycle()方法來(lái)釋放這塊內存。
2、Bitmap的回收機制
Bitmap的回收機制是通過(guò)底層C++實(shí)現的,當我們調用(yong)recycle()方法時(shí),會(huì )將Bitmap對象標記為已回收,Android系統會(huì )在合適的時(shí)機,比如GC時(shí),回收這些已標記的(′?`*)Bitmap對象,這樣,我們就可以避免因為Bitmap占用過(guò)多內存而導致的OOM(Out of Memory)問(wèn)題。
3、Bitmap何時(shí)會(huì )(′?ω?`)被釋放
Bitmap對象被設置為null;
Bitmap對象所在的Activity或者View被銷(xiāo)毀;
系統內存不(bu)足,需要進(jìn)行GC操作。
需要注意的是,即使我們調用了recycle()方法,Bitmap也不一定會(huì )被立即釋放(fang),因為Android系統可能會(huì )在其他時(shí)刻進(jìn)行GC操作,所以我們不能確切地知道Bitmap何時(shí)會(huì )被釋放,我們可以確保的是,只要Bitmap被標記??為已回收,它就不會(huì )被重ヽ(′ー`)ノ(zhong)復使用,從而避免了內存泄漏的問(wèn)題。
4、如何正確使用(′?ω?`)Bitmap
為了避免內存泄漏和性能問(wèn)題,我們需要正確地使用Bitmap,以下是一些建議:
盡量??避免在?循環(huán)中使用Bitmap,因為這樣會(huì )導致頻繁地創(chuàng )建和銷(xiāo)毀Bitmap對象,從而影響性能,?如果需要在循環(huán)中使用Bitmap,可以考慮使用軟引用(SoftReference)來(lái)緩存Bitmap對象;
當不再需要Bitmap時(shí),及時(shí)調用recycle()方法來(lái)釋放內存;
如果需要對Bitmap進(jìn)行縮放、旋轉等操作,可以使用Matrix類(lèi)來(lái)完成,而不是創(chuàng )建新的Bitmap對象(xiang);
對于大圖,可以考慮使用分塊加(jia)載的方式,而不是一次性加載整張圖片到內存中。
相關(guān)問(wèn)題與解答:
1、(′▽?zhuān)?Q: 為什么調用recycle()方法后,Bitmap仍然占用內存?
A: 雖然我們調用了recycle((⊙_⊙))方法,但Android系統可??能還沒(méi)有進(jìn)行GC操作,只有當系統??內存不足時(shí),才會(huì )觸發(fā)GC操作,從而釋放Bitmap占用的內存,我們不能確切地知道Bitmap何時(shí)會(huì )被釋放,我們可以確保的(de)是,??只要Bitmap被標記為已回收,它就不會(huì )(hui)被重復使用。
2、Q: 為什么有時(shí)候調用recycle()方法后,程序還是會(huì )崩潰?
A: 這可能是??因(yin)為其他部分的代碼還在使用這個(gè)已??經(jīng)被回收的Bitmapヽ(′ー`)ノ對象,當這部分代碼試圖訪(fǎng)問(wèn)這個(gè)已經(jīng)被回收的對象時(shí),就會(huì )發(fā)生崩潰,為了避免這種情況,我們需要確保在調用recycle()方法后,不再使用這個(gè)Bitmap對象。
A: 這可能是因為recycle()方法只是將Bitmap對象標記為已回收,而并沒(méi)有立(li)即釋放內存,當系統內存不足時(shí),才會(huì )觸發(fā)GC操作來(lái)釋放這些已標記的Bitmap對象,在GC操作之前,這些被回收的Bitmap對象仍然會(huì )占用內(nei)存,為了避免這種情況,我們可以盡量減少創(chuàng )建和回收Bitmap對象的操作,(°ロ°) !從而提高程序的性能。
A: 這可能是ヾ(^-^)ノ因為Android系統的垃圾回收機制并不是實(shí)時(shí)進(jìn)行的,當系統內存不足時(shí),才會(huì )觸發(fā)GC操作來(lái)釋放內存,我們不能期望在調(diao)用recヽ(′ー`)ノycle()方法后立即看到內存??占用的減少,我們可以確保的是,只要Bitmap被標記??為已回收,它就不會(huì )被重復使用,從而避免了內存泄漏的問(wèn)題。
客服電話(huà)19974869549
Copyright ? 2012-2018 天津九安特機電工程有限公司 版權所有 備案號:
客服電話(huà)18966584448