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