僅為自己學習歸納
Image Pipeline
大致流程如下:
- 尋找內(nèi)存緩存(Bitmap Cache)中是否有圖片边苹,有著返回升熊,無則繼續(xù)尋找媒怯。
- 后臺線程開始工作骨宠。
- 尋找未解碼緩存中是否有圖片,如有钧汹,解碼,變換录择,返回拔莱。然后將其緩存在內(nèi)存緩存中。
- 尋找磁盤緩存中是否有圖片隘竭,如有塘秦,解碼,變換动看,返回尊剔。然后將其緩存到未解碼緩存和內(nèi)存緩存中。
- 從網(wǎng)絡和本地加載圖片菱皆,加載后解碼须误,變換,返回仇轻。然后將其緩存到各個緩存中去京痢。
上圖中,disk cache實際包含了未解碼的內(nèi)存緩存在內(nèi)篷店,統(tǒng)一在一起只是為了邏輯稍微清楚一些祭椰。
關于disk cache
的官方解釋:
Yes, we know phones don’t have disks, but it’s too tedious to keep saying local storage cache
Image Pipeline默認有3個線程池:
- 3個線程用于網(wǎng)絡下載。
- 2個線程用于磁盤操作:本地文件的讀取疲陕,磁盤緩存的操作方淤。
- 2個線程用于CPU相關的操作:解碼,變換蹄殃,以及后出來等后臺操作携茂。
三級緩存
1.Bitmap緩存
Bitmap緩存儲存Bitmap
對象,這些Bitmap對象可以立刻用來顯示或者用于后處理
在5.0以下系統(tǒng)窃爷,BItmap緩存位于ashmem
邑蒋,這樣Bitmap對象的創(chuàng)建和釋放將不會一發(fā)GC(Gabage Collection),更少的GC會使APP更加流暢姓蜂。
5.0及其以上系統(tǒng),內(nèi)存管理有了很大的改進医吊,所以Bitmap緩存直接位于Jav啊的heap(堆內(nèi)存)上
當應用在后臺運行時钱慢,該內(nèi)存會被清空。
ashmem:匿名共享內(nèi)存
未解碼圖片的內(nèi)存緩存
這個緩存存儲的時原始壓縮格式的圖片卿堂。從該緩存取到的圖片在使用之前束莫,需要先進行解碼。
如果有調(diào)整大小草描,旋轉览绿,或者WebP編碼工作需要完成,這些工作會在解碼之前進行穗慕。
磁盤緩存
和未解碼的內(nèi)存緩存相似谓谦,磁盤緩存儲存的時未解碼的原始壓縮格式的圖片啊犬,在使用之前同樣需要解碼等處理。
和其他的不一樣,磁盤緩存在后臺時幅垮,不會被清空拱层,即使設備關閉虹菲,不過用戶可以隨時進入系統(tǒng)菜單進行清空緩存操作憋肖。