本教程內(nèi)容來(lái)源于:http://fresco-cn.org
采用 知識(shí)共享 署名 4.0 國(guó)際 許可協(xié)議 進(jìn)行許可
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ì)被清空。
這個(gè)緩存存儲(chǔ)的是原始?jí)嚎s格式的圖片。從該緩存取到的圖片在使用之前,需要先進(jìn)行解碼。
如果有調(diào)整大小,旋轉(zhuǎn),或者WebP編碼轉(zhuǎn)換工作需要完成,這些工作會(huì)在解碼之前進(jìn)行。
APP在后臺(tái)時(shí),這個(gè)緩存同樣會(huì)被清空。
和未解碼的內(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)行清空緩存操作。
如果要使用2個(gè)緩存,在配置image pipeline 時(shí)調(diào)用 setMainDiskCacheConfig
和 setSmallImageDiskCacheConfig
方法即可。
大部分的應(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ì)被忽略。
在 配置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)了DiskTrimmableRegistry 和 MemoryTrimmableRegistry 接口的對(duì)象。
實(shí)現(xiàn)了這兩個(gè)接口的對(duì)象保持著一個(gè)列表,列表中的各個(gè)元素在內(nèi)存不夠時(shí),縮減各自的內(nèi)存用量。