glide的快取策略

2021-08-07 18:06:51 字數 2733 閱讀 3272

本文主要介紹了如何配置和管理glide中的快取,其中大部分內容都可以直接在官方wiki中找到,這裡只是進行了整理和彙總。言歸正傳,glide支援的二級快取(並不是**快取,因為從網路載入並不屬於快取),即記憶體快取和磁碟快取。

磁碟快取

一般的快取指的就是磁碟快取,把網路上的快取到本地,這樣就不需要每次都從網路載入,既提高了載入速度,又為使用者節省了流量。glide在預設情況下是開啟磁碟快取的,而且提供了豐富的api來讓開發者自己配置和管理磁碟快取。

快取位置和大小

開發者可以通過構建乙個自定義的glidemodule來配置glide磁碟快取的位置和大小。最簡單的方法如下:

public class diskcachemoudle implements glidemodule 

@override

public void registercomponents(context context, glide glide)

}

如果不想把快取放在上面的兩個位置怎麼辦?glide當然也支援,具體通過disklrucachefactory來實現:

builder.setdiskcache(

new disklrucachefactory(new disklrucachefactory.cachedirectorygetter()

}), 100 * 1024 * 1024);

note: getmycachelocationblockingio方法返回的檔案不能為空,而且必須是乙個已經建立好的檔案目錄,不可以是檔案。

快取策略

與其他載入庫的快取機制不同,glide快取時預設只快取最終載入的那張。舉個栗子,你要載入的解析度為1000x1000,但是最終顯示該的imageview大小只有500x500,那麼glide就會只快取500x500的小圖。這也是在從磁碟快取中載入時glide比picasso快的原因。glide目前提供了四種快取策略:

diskcachestrategy.none 不快取檔案

diskcachestrategy.source 只快取原圖

diskcachestrategy.result 只快取最終載入的圖(預設的快取策略)

diskcachestrategy.all 同時快取原圖和結果圖

快取演算法

在glide中磁碟快取預設使用的是lru(least recently used)演算法。如果你想使用其他的快取演算法,就只能通過實現diskcache介面來完成了。

記憶體快取

builder.setmemorycache(new lruresourcecache(yoursizeinbytes));
glide.get(context).setmemorycategory(memorycategory.high);
memorycategory有3個值可供選擇:

memorycategory.high(初始快取大小的1.5倍)

memorycategory.normal(初始快取大小的1倍)

memorycategory.low(初始快取大小的0.5倍)

在有些情況下我們不希望做記憶體快取(比如載入gif),這個時候可以呼叫skipmemorycache(true)方法跳過記憶體快取。

如何快取動態url的

一般情況下我們從網路上獲取到的url都是靜態的,即一張對應乙個url。那麼如果是一張對應多個url呢?快取不就沒有意義了。因為載入庫都是拿的url來作為快取的key的,glide也不例外,只是會更加複雜一些。如果你開啟了glide的log,就會在控制台看到glide是如何指定快取key的。關於如何開啟log,請參考這篇文章。一般來說,glide的key由的url、view的寬和高、螢幕的尺寸大小和signature組成。

首先新建乙個叫做qiniuimage的類:

public class qiniuimage 

public string getimageurl()

public string getimageid() else

}}

public class qiniuimageloader implements streammodelloader};}

public static class factory implements modelloade***ctory

@override

public void teardown()

}}

其中httpurlfetcher的getid方法就是組成快取的key的重要部分。這也是我們的核心原理。

將這個modelloader註冊到glidemodule中,並在androidmanifest.xml中註冊:

public class qiniumodule implements glidemodule 

@override

public void registercomponents(context context, glide glide)

}

glide.with(context)

.load(new qiniuimage(imageurl)

.into(imageview);

Glide關於清除快取策略

glide已經很強大了 自帶快取清楚功能 清除記憶體快取 glide.get activity clearmemory 清除磁碟快取 glide.get activity cleardiskcache 其中需要注意的是 1 清除記憶體快取是在主線程中 2 清除磁碟快取是在子執行緒中進行 如果需要自定...

Glide快取機制

1.linkedhashmap 2.cleanupcallable 涉及到threadpoolexecutor private final callablecleanupcallable new callable trimtosize if journalrebuildrequired return...

Glide快取配置

glide依賴 這裡用的是android studio3.0 設定快取大小為20mb int memorycachesizebytes 1024 1024 20 20mb 設定記憶體快取大小 builder.setmemorycache new lruresourcecache memorycach...