1. 程式人生 > >Android快取策略與圖片載入

Android快取策略與圖片載入

Android快取策略

Android快取策略

當程式第一次從網路載入圖片後,就將其快取到儲存裝置和記憶體中。當下次程式使用圖片時,會先從記憶體中獲取,如果記憶體中沒有再從儲存裝置中獲取,如果儲存裝置中也沒有,則從網路上下載這張圖片。

從記憶體中載入圖片比從儲存裝置中載入圖片要快,可以提高程式的效率且節約流量。

LRU(Least Recently Used)是一種常用的快取演算法。即近期最少使用演算法。
LRU核心思想是當快取滿時,優先淘汰那些近期最少使用的快取物件。

LruCache

LruCache是Android3.1提供的快取類,Android官方API。可以用support-v4相容包中提供的LruCache相容早期Android版本。
LruCache是一個泛型類,內部採用一個LinkedHashMap以強引用的方式儲存快取的物件。LruCache執行緒安全。

DiskLruCache

DiskLruCache用於實現儲存裝置快取。DiskLruCache非Android官方API。

glide

提供:bumptech
地址:https://github.com/bumptech/glide
當前版本:4.8.0
Glide是一個快速高效的Android圖片載入庫。
Glide 支援拉取,解碼和展示視訊快照,圖片,和GIF動畫。
Glide使用的是一個定製化的基於HttpUrlConnection的棧,但同時也提供了與Google Volley和Square OkHttp快速整合的工具庫。

鏈式呼叫

	ImageView imageView = findViewById(R.id.test);
    ImgurGlide.with(getApplicationContext
()) .load(imageUrl) .into(imageView);

配合生命週期使用

Glide在載入資源的時候,如果是在Activity、Fragment上進行,當Activity、Fragment等元件進入不可見,或者已經銷燬的時候,Glide 會停止載入資源。
如果不在Activity/Fragment上進行,則根據Application的生命週期,在應用程式關閉的時候終止載入。

快取設定

  1. 某些情形下,你可能希望只要圖片不在快取中則載入直接失敗(比如省流量模式)。如下設定則如果圖片在記憶體快取或在磁碟快取中,它會被展示出來。否則只要這個選項被設定為 true ,這次載入會視同失敗。
GlideApp.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);
  1. 如果你想跳過磁碟和/或記憶體快取(比如圖片驗證碼),如下設定:
GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(view);

fresco

提供:facebook
地址:https://github.com/facebook/fresco
當前版本:1.10.0

新增依賴

build.gradle檔案中新增依賴

dependencies {
  // 其他依賴
  compile 'com.facebook.fresco:fresco:1.5.0'
}

下面的依賴需要根據需求新增:

dependencies {

  // 支援 GIF 動圖,需要新增
  compile 'com.facebook.fresco:animated-gif:1.5.0'

  // 支援 WebP (靜態圖+動圖),需要新增
  compile 'com.facebook.fresco:animated-webp:1.5.0'
  compile 'com.facebook.fresco:webpsupport:1.5.0'

  // 僅支援 WebP 靜態圖,需要新增
  compile 'com.facebook.fresco:webpsupport:1.5.0'

  // 新增Android支援包(你可能已經添加了該依賴或者類似的依賴包)
  compile 'com.android.support:support-core-utils:25.3.1'
}

初始化

在Application中呼叫Fresco.initialize初始化Fresco類。

	Fresco.initialize(this);

SimpleDraweeView

使用com.facebook.drawee.view.SimpleDraweeView展示圖片。

	<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="130dp"
    android:layout_height="130dp"
    fresco:placeholderImage="@drawable/my_drawable"
  />
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

glide和fresco對比

glide優點:

  1. 生命週期整合。
  2. 複用和主動回收bitmap,減少系統回收壓力。
  3. 快取策略靈活,多種規格快取。

glide缺點:

  1. Java heap比Fresco高。

fresco優點:

  1. 在5.0以下系統(最低2.3)對bitmap的載入效率高,Fresco將圖片放到一個特別的記憶體區域(Ashmem區)。
  2. 大大減少OOM(在更底層的Native層對OOM進行處理,圖片將不再佔用App的記憶體)。

fresco缺點:

  1. 包較大(2~3M)
  2. 用法複雜