1. 程式人生 > >Fresco圖片框架

Fresco圖片框架

  • 優一:

       1、支援webp格式的圖片,是Google官方推行的,它的大小比其它格式圖片的大小要小一半左右,使用該格式最大的優點就是輕量、省流量、圖片載入迅速。而Fresco是通過jni來實現支援WebP格式圖片。

  • 優二:

       2、5.0以下系統:使用”ashmem”(匿名共享記憶體)區域儲存Bitmap快取,這樣Bitmap物件的建立、釋放將永遠不會觸發GC,關於”ashmem”儲存區域,它是一個不在Java堆區的一片儲存記憶體空間,它的管理由Linux核心驅動管理,不必深究,只要知道這塊儲存區域是別於堆記憶體之外的一塊空間就行了,且這塊空間是可以多程序共享的,GC的活動不會影響到它。5.0以上系統,由於記憶體管理的優化,所以對於5.0以上的系統Fresco將Bitmap快取直接放到了堆記憶體中。

       Fresco中採取的辦法則是使用引用計數的方式,其中有一個SharedReference這個類,這個類中有這麼兩個方法:addReference()和deleteReference(),通過這兩個基本方法來對引用進行計數,一旦計數為零時,則對應的資源將會清除(如:Bitmap.recycle()等),而Fresco為了考慮更容易被我們使用,又提供了一個CloseableReference類,該類可以說是SharedReference類上功能的封裝,CloseableReference同時也實現了Cloneable、Closeable介面,它在呼叫.clone()方法時同時會呼叫addReference()來增加一個引用計數,在呼叫.close()方法時同時會呼叫deleteReference()來刪除一個引用計數,所以在使用Fresco的使用,我們都是與CloseableReference類打交道,使用CloseableReference必須遵循以下兩條規則:

            1、在賦值CloseableReference給新物件的時候,呼叫.clone()進行賦值

            2、在超出作用域範圍的時候,必須呼叫.close(),通常會在finally程式碼塊中呼叫

?

1 2 3 4

56 7 8

<code class="hljs cs">void gee() { CloseableReference<val> ref = foo();

try { haa(ref); } finally { ref.close(); } }</val></code>

遵循這些規則可以有效地防止記憶體洩漏。

優三:

3、使用了三級快取:Bitmap快取+未解碼圖片快取+硬碟快取。

其中前兩個就是記憶體快取,Bitmap快取根據系統版本不同放在了不同記憶體區域中,而未解碼

圖片的快取只在堆記憶體中,Fresco分了兩步做記憶體快取,這樣做有什麼好處呢?第一個好處

就如上的第二條,第二個好處是加快圖片的載入速度,Fresco的載入圖片的流程為:查詢

Bitmap快取中是否存在,存在則直接返回Bitmap直接使用,不存在則查詢未解碼圖片的緩

存,如果存在則進行Decode成Bitmap然後直接使用並加入Bitmap快取中,如果未解碼圖片緩

存中查詢不到,則進行硬碟快取的檢查,如有,則進行IO、轉化、解碼等一系列操作,最後

成Bitmap供我們直接使用,並把未解碼(Encode)的圖片加入未解碼圖片快取,把Bitmap加

入Bitmap快取中,如硬碟快取中沒有,則進行Network操作下載圖片,然後加入到各個快取

中。

既然Fresco使用了三級低的情況快取,而有兩級是記憶體快取,所以當我們的App在後臺時或

者在記憶體下在onLowMemory()方法中,我們應該手動清除應用的記憶體快取,我們可以使用下

面的方式:

?

1 2 3 4

56 7 8

<code class="hljs avrasm"> ImagePipeline imagePipeline = Fresco.getImagePipeline();//清空

記憶體快取(包括Bitmap快取和未解碼圖片的快取) imagePipeline.clearMemoryCaches(); //清空硬碟快取,

一般在設定介面供使用者手動清理 imagePipeline.clearDiskCaches(); //同時清理記憶體快取和硬碟快取

imagePipeline.clearCaches();</code>