自動釋放記憶體!Facebook推出強大Android圖片庫Fresco

iteye發表於2015-03-31

快速而又高效的顯示圖片對 Android 裝置來說是件極其重要的事情,但在過去的幾年裡,在有效儲存影像方面我們面臨了很多問題。圖片太大,而手機又只有很小的記憶體,特別是 Android 裝置還要將記憶體分割給各個應用。所以,太多的圖片總會耗去大部分的記憶體,從而導致應用的崩潰。

為了解決這一問題,Facebook 最近推出了一款用於 Android 應用中展示圖片的強大圖片庫 Fresco,它能夠從網路、本地儲存和本地資源中載入圖片。而且,為了節省資料和 CPU,它擁有三級快取。此外,Fresco 在顯示方面是用了 Drawees,可以顯示佔位符,直到圖片載入完成。而當圖片從螢幕上消失時,會自動釋放圖片所佔的記憶體。Fresco 支援 Android 2.3 及以上版本,目前已託管至 Github 上。

主要特性:

  • 記憶體

解壓後的圖片和 Android 的點陣圖都會佔據很大的記憶體,這導致 Java 垃圾收集器更頻繁的執行,也讓應用變得更加緩慢,這一問題在沒有對垃圾收集器進行完善的 Android 5.0 上尤為嚴重。

在 Android 4.x 及以下版本,Fresco 將圖片放置在 Android 記憶體的一個特殊位置。這可以確保當影像不在螢幕上顯示時,可以自動釋放它們所佔的記憶體。讓應用執行的更快速,且不易崩潰。

使用 Fresco 的應用,即使在配置低端的裝置上也能正常執行,而且你無需經常性地去擔心圖片的記憶體佔用情況。

  • Streaming

Web 上的漸進式(Progressive)JPEG 圖片已經存在多年,開啟檔案過程中,會先顯示整個圖片的模糊輪廓,隨著掃描次數的增加,圖片變得越來越清晰。這種格式可以說是網路較慢情況下的救星,通過圖片的輪廓知道正在載入的圖片大概是什麼。

Android 自己的圖片庫不支援 streaming,而 Fresco 可以,只需指定一個 URI,你的應用程式就可以隨著資料的到來,自動更新它的顯示。

  • 動畫

動畫 GIF 和 WebP 應該是應用的難點,每一幀都是一個大型的點陣圖,而每個動畫都是一系列的幀。Fresco 則負責載入和處理這些幀及管理它們的記憶體。

  • Drawing

Fresco 在顯示方面使用了 Drawees,Fresco 的 Drawees 能夠顯示佔位符,直到圖片已載入,並自動顯示到影像到達時: 

  1. 將圖片擴充套件至自定義的焦點,而不是作為處理的中心。
  2. 使用圓角化或圓形來顯示影像。
  3. 如果網路載入失敗的話,使用者可以點選佔位符重新載入影像。
  4. 顯示自定義背景、浮窗小部件(overlays)或影像上的進度條。
  5. 當使用者點選圖片,自定義浮窗小部件。
  • 載入

Fresco 的影像管道可以讓你以多種方法來自定義載入: 

  1. 為一個影像指定不同的 URI,從中選取一個已經快取的顯示。
  2. 優先顯示低解析度影像,待資料到達後交換到高的解析度。
  3. 如果影像有 EXIF 縮圖,首先顯示縮圖,直到整個圖片被載入出來(只針對本地圖片)。
  4. 調整或旋轉影像。

即使是在老版的 Android 上也可以解碼 WebP 影像,只不過不是全部支援。

傳送門:Fresco 官網Github 託管地址

相關文章