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的生命週期,在應用程式關閉的時候終止載入。
快取設定
- 某些情形下,你可能希望只要圖片不在快取中則載入直接失敗(比如省流量模式)。如下設定則如果圖片在記憶體快取或在磁碟快取中,它會被展示出來。否則只要這個選項被設定為 true ,這次載入會視同失敗。
GlideApp.with(fragment)
.load(url)
.onlyRetrieveFromCache(true)
.into(imageView);
- 如果你想跳過磁碟和/或記憶體快取(比如圖片驗證碼),如下設定:
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優點:
- 生命週期整合。
- 複用和主動回收bitmap,減少系統回收壓力。
- 快取策略靈活,多種規格快取。
glide缺點:
- Java heap比Fresco高。
fresco優點:
- 在5.0以下系統(最低2.3)對bitmap的載入效率高,Fresco將圖片放到一個特別的記憶體區域(Ashmem區)。
- 大大減少OOM(在更底層的Native層對OOM進行處理,圖片將不再佔用App的記憶體)。
fresco缺點:
- 包較大(2~3M)
- 用法複雜