Android之解決太大太多圖片造成的oom
內(nèi)存溢出?
在最近做的工程中發(fā)現(xiàn)加載的圖片太多或圖片過大時經(jīng)常出現(xiàn)OOM問題,找網(wǎng)上資料也提供了很多方法,但自己感覺有點亂,特此,今天在不同型號的三款安卓手機(jī)上做了測試,因為有效果也有結(jié)果,今天小馬就做個詳細(xì)的總結(jié),以供朋友們共同交流學(xué)習(xí),也供自己以后在解決OOM問題上有所提高,提前講下,片幅有點長,涉及的東西太多,大家耐心看,肯定有收獲的,里面的很多東西小馬也是學(xué)習(xí)參考網(wǎng)絡(luò)資料使用的,先來簡單講下下:
?? 一般我們大家在遇到內(nèi)存問題的時候常用的方式網(wǎng)上也有相關(guān)資料,大體如下幾種:
?? 一:在內(nèi)存引用上做些處理,常用的有軟引用、強(qiáng)化引用、弱引用
?? 二:在內(nèi)存中加載圖片時直接在內(nèi)存中做處理,如:邊界壓縮
?? 三:動態(tài)回收內(nèi)存
?? 四:優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配
?? 五:自定義堆內(nèi)存大小
?? 可是真的有這么簡單嗎,就用以上方式就能解決OOM了?不是的,繼續(xù)來看...
?? 下面小馬就照著上面的次序來整理下解決的幾種方式,數(shù)字序號與上面對應(yīng):
?? 1:軟引用(SoftReference)、虛引用(PhantomRefrence)、弱引用(WeakReference),這三個類是對heap中java對象的應(yīng)用,通過這個三個類可以和gc做簡單的交互,除了這三個以外還有一個是最常用的強(qiáng)引用
??? 1.1:強(qiáng)引用,例如下面代碼:
Object o=new Object();??????Object o1=o;??
???? 上面代碼中第一句是在heap堆中創(chuàng)建新的Object對象通過o引用這個對象,第二句是通過o建立o1到new Object()這個heap堆中的對象的引用,這兩個引用都是強(qiáng)引用.只要存在對heap中對象的引用,gc就不會收集該對象.如果通過如下代碼:
o=null;??????o1=null
????? heap中對象有強(qiáng)可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達(dá)對象。應(yīng)用的強(qiáng)弱順序是強(qiáng)、軟、弱、和虛。對于對象是屬于哪種可及的對象,由他的最強(qiáng)的引用決定。如下:
String abc=new String("abc");?//1????? SoftReference