圖片內(nèi)存優(yōu)化都是一些比較瑣碎的點(diǎn)位他,這里記錄幾個(gè)開(kāi)發(fā)中常遇到的。
XML中的可優(yōu)化點(diǎn)
1 盡量少使用selector
使用selector來(lái)做選中的效果很方便,但是有一點(diǎn)小問(wèn)題就是selector會(huì)一次性將兩張圖片一塊兒加載到內(nèi)存款票,如果頁(yè)面中Button很多且圖片大的話就會(huì)占用相當(dāng)一部分內(nèi)存踏幻。
解決方案:解決方案就是利用onTouch()處理枷颊,監(jiān)聽(tīng)down、move事件來(lái)做為pressed狀態(tài)處理该面,然后up事件恢復(fù)默認(rèn)圖片夭苗。如果你覺(jué)的很麻煩的話,沒(méi)關(guān)系我也這么覺(jué)的隔缀。题造。。猾瘸。即便是可以做統(tǒng)一處理
2 盡量不要AnimationDrawable
AnimationDrawable也就是我們常說(shuō)的幀動(dòng)畫(huà)晌梨,這個(gè)動(dòng)畫(huà)是需要配置每一幀的圖片都加載到內(nèi)存。
3 不要給Activity設(shè)置背景圖
4 使用ViewStub來(lái)展示圖片
如果圖片比較大且不是必要出現(xiàn)時(shí)可以考慮使用ViewStub來(lái)處理
Bitmap相關(guān)
1 Bitmap使用完之后及時(shí)recycle掉
2 將Bitmap大小設(shè)置成與ImageView大小相當(dāng)须妻,通過(guò)isSimpleSize屬性來(lái)處理
3 選擇合適的位圖格式仔蝌,位圖格式有ARGB8888、ARGB4444荒吏,RGB565敛惊、ALPHA_8這4種,所占內(nèi)存字節(jié)數(shù)分別是4绰更、2瞧挤、2锡宋、1字節(jié),Android默認(rèn)位圖格式時(shí)ARGB8888特恬,如果對(duì)圖片質(zhì)量要求不高的時(shí)候可以使用ARGB4444
網(wǎng)絡(luò)圖片
Glide的緩存模型時(shí)怎么樣的执俩?大致來(lái)說(shuō)是兩層內(nèi)存緩存和資盤緩存,但是內(nèi)存緩存又分為了兩層分別是active和lru癌刽,所以總的來(lái)說(shuō)是三層吧役首。
1 active
這層利用的是HashMap但是重點(diǎn)是HashMap持有的是弱引用,這樣就能保證這部分圖片在GC時(shí)候被回收显拜,而這部分圖片就是表示正在使用的圖片衡奥。active里面的對(duì)象生命周期都比較短,沒(méi)有設(shè)置容量上限远荠,但是LRU就有
2 lru
這部分就是LRUCache矮固,這個(gè)部分的空間大小默認(rèn)是屏幕寬的像素值x高的像素值x4這么多字節(jié)
3 磁盤緩存
當(dāng)active和lru都沒(méi)有獲取到圖片的時(shí)候,就嘗試從磁盤緩存中獲取譬淳,磁盤緩存是IO操作所以必然會(huì)放到線程里面去做档址。EngineJob就是一個(gè)Runnable
三者之前的關(guān)系又是怎么樣的呢?有下面幾點(diǎn)
1 首先從active中讀邻梆,如果沒(méi)有就從lru中讀辰晕,如果lru中也沒(méi)有的話就會(huì)從磁盤里面讀。
2 如果active中沒(méi)讀取到确虱,但是從lru中讀取到了含友,則會(huì)在active中添加同事會(huì)移除lru中的該圖片對(duì)象。反之如果active中的圖片不再被使用時(shí)校辩,會(huì)從active中移除同時(shí)會(huì)添加到lru中
3 當(dāng)active中和lru中都沒(méi)有讀取到圖片窘问,則從磁盤中讀完成而之后會(huì)添加到active中
Glide早期的版本是先從lru中讀,然后再放到active中宜咒。