鍍金池/ 教程/ Android/ 緩存
進(jìn)度條
在JAVA代碼中使用Drawees
Drawee的各種效果配置
緩存
一些陷阱
關(guān)于在Android Studio中編譯
多圖請(qǐng)求及圖片復(fù)用
自定義網(wǎng)絡(luò)加載
支持的URIs
可關(guān)閉的引用
監(jiān)聽(tīng)下載事件
修改圖片
引入Fresco
縮放
圓角和圓圈
配置Image Pipeline
縮放和旋轉(zhuǎn)圖片
(圖片請(qǐng)求)Image Requests
自定義View
使用ControllerBuilder
在XML中使用Drawees
開(kāi)始使用 Fresco
關(guān)鍵概念
Image Pipeline介紹
漸進(jìn)式JPEG圖
數(shù)據(jù)源和數(shù)據(jù)訂閱者
直接使用Image Pipeline
動(dòng)畫(huà)圖(gif)
使用其他的Image Loader

緩存

本教程內(nèi)容來(lái)源于:http://fresco-cn.org
采用 知識(shí)共享 署名 4.0 國(guó)際 許可協(xié)議 進(jìn)行許可

三級(jí)緩存

1. Bitmap緩存

Bitmap緩存存儲(chǔ)Bitmap對(duì)象,這些Bitmap對(duì)象可以立刻用來(lái)顯示或者用于后處理

在5.0以下系統(tǒng),Bitmap緩存位于ashmem,這樣Bitmap對(duì)象的創(chuàng)建和釋放將不會(huì)引發(fā)GC,更少的GC會(huì)使你的APP運(yùn)行得更加流暢。

5.0及其以上系統(tǒng),相比之下,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上。

當(dāng)應(yīng)用在后臺(tái)運(yùn)行是,該內(nèi)存會(huì)被清空。

2. 未解碼圖片的內(nèi)存緩存

這個(gè)緩存存儲(chǔ)的是原始?jí)嚎s格式的圖片。從該緩存取到的圖片在使用之前,需要先進(jìn)行解碼。

如果有調(diào)整大小,旋轉(zhuǎn),或者WebP編碼轉(zhuǎn)換工作需要完成,這些工作會(huì)在解碼之前進(jìn)行。

APP在后臺(tái)時(shí),這個(gè)緩存同樣會(huì)被清空。

3. 文件緩存

和未解碼的內(nèi)存緩存相似,文件緩存存儲(chǔ)的是未解碼的原始?jí)嚎s格式的圖片,在使用之前同樣需要經(jīng)過(guò)解碼等處理。

和內(nèi)存緩存不一樣,APP在后臺(tái)時(shí),內(nèi)容是不會(huì)被清空的。即使關(guān)機(jī)也不會(huì)。用戶可以隨時(shí)用系統(tǒng)的設(shè)置菜單中進(jìn)行清空緩存操作。

用一個(gè)文件還是兩個(gè)文件緩存?

如果要使用2個(gè)緩存,在配置image pipeline 時(shí)調(diào)用 setMainDiskCacheConfigsetSmallImageDiskCacheConfig 方法即可。

大部分的應(yīng)用有一個(gè)文件緩存就夠了,但是在一些情況下,你可能需要兩個(gè)緩存。比如你也許想把小文件放在一個(gè)緩存中,大文件放在另外一個(gè)文件中,這樣小文件就不會(huì)因大文件的頻繁變動(dòng)而被從緩存中移除。

至于什么是小文件,這個(gè)由應(yīng)用來(lái)區(qū)分,在創(chuàng)建image request, 設(shè)置 ImageType 即可:

java
ImageRequest request = ImageRequest.newBuilderWithSourceUri(uri)
    .setImageType(ImageType.SMALL)

如果你僅僅需要一個(gè)緩存,那么不調(diào)用setSmallImageDiskCacheConfig即可。Image pipeline 默認(rèn)會(huì)使用同一個(gè)緩存,同時(shí)ImageType也會(huì)被忽略。

內(nèi)存用量的縮減

配置Image pipeline 時(shí),我們可以指定每個(gè)緩存最大的內(nèi)存用量。但是有時(shí)我們可能會(huì)想縮小內(nèi)存用量。比如應(yīng)用中有其他數(shù)據(jù)需要占用內(nèi)存,不得不把圖片緩存清除或者減小 或者我們想檢查看看手機(jī)是否已經(jīng)內(nèi)存不夠了。

Fresco的緩存實(shí)現(xiàn)了DiskTrimmable 或者 MemoryTrimmable 接口。這兩個(gè)接口負(fù)責(zé)從各自的緩存中移除內(nèi)容。

在應(yīng)用中,可以給Image pipeline配置上實(shí)現(xiàn)了DiskTrimmableRegistryMemoryTrimmableRegistry 接口的對(duì)象。

實(shí)現(xiàn)了這兩個(gè)接口的對(duì)象保持著一個(gè)列表,列表中的各個(gè)元素在內(nèi)存不夠時(shí),縮減各自的內(nèi)存用量。