日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...

發(fā)布時間:2024/1/23 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言Glide,該功能非常強(qiáng)大 Android ?圖片加載開源框架 相信大家并不陌生

正由于他的功能強(qiáng)大,所以它的源碼非常復(fù)雜,這導(dǎo)致很多人望而卻步

本人嘗試將 Glide 的功能進(jìn)行分解,并單獨針對每個功能進(jìn)行源碼分析,從而降低Glide源碼的復(fù)雜度。接下來,我將推出一系列關(guān)于 Glide的功能源碼分析,有興趣可以繼續(xù)關(guān)注

今天,我將主要講解在使用Glide緩存功能時的問題:為什么Glide 的緩存無起作用,希望你們會喜歡。

1. 背景Glide實現(xiàn)內(nèi)存 & 磁盤緩存是根據(jù) 圖片的緩存Key進(jìn)行唯一標(biāo)識

開發(fā)者為了降低成本 & 安全,往往會將圖片存放在云服務(wù)器上如 七牛云 等等。

為了保護(hù) 客戶的圖片資源,圖片云服務(wù)器 會在圖片Url地址的基礎(chǔ)上再加一個token參數(shù)http://url.com/image.jpg?token=a6cvva6b02c670b0aGlide加載該圖片時,會使用加了token參數(shù)的圖片Url地址 作為

id參數(shù),從而生成 緩存Key

2. 問題作為身份認(rèn)證的token參數(shù)可能會發(fā)生變化,并不是一成不變

若 token參數(shù)變了,則圖片Url跟著變,則生成緩存key的所需id參數(shù)發(fā)生變化,即 緩存Key也會跟著變化

這導(dǎo)致同一張圖片,但因為token參數(shù)變化,而導(dǎo)致緩存Key發(fā)生變化,從而使得 Glide的緩存功能失效緩存Key發(fā)生變化,即同一個圖片的當(dāng)前緩存key 和 之前寫入緩存的key不相同,這意味著 在讀取緩存時 無法根據(jù)當(dāng)前緩存key 找到之前的緩存,從而使得失效

3. 解決方案

3.1 原理

在 生成緩存Key 的id參數(shù) 前,將 帶有token參數(shù)的圖片Url地址 去掉 token參數(shù),從而根據(jù) 初始的圖片Url地址 生成緩存Key的id參數(shù)實現(xiàn)了一個圖片的緩存Key的id參數(shù)始終唯一 ,即等于 圖片Url地址

3.2 儲備知識:生成緩存Key的id參數(shù)的邏輯

生成緩存Key的id參數(shù)的邏輯為:直接將圖片的 URL 地址作為緩存Key的id參數(shù)public?class?Engine?implements?EngineJobListener,

MemoryCache.ResourceRemovedListener,

EngineResource.ResourceListener?{

public??LoadStatus?load(Key?signature,?int?width,?int?height,?DataFetcher?fetcher,

DataLoadProvider?loadProvider,?Transformation?transformation,?ResourceTranscoder?transcoder,

Priority?priority,?boolean?isMemoryCacheable,?DiskCacheStrategy?diskCacheStrategy,?ResourceCallback?cb)?{

Util.assertMainThread();

long?startTime?=?LogTime.getLogTime();

final?String?id?=?fetcher.getId();

//?獲得了一個id字符串,即需加載圖片的唯一標(biāo)識

//?如,若圖片的來源是網(wǎng)絡(luò),那么該id?=?這張圖片的url地址

//?fetcher?=?HttpUrlFetcher的實例,即調(diào)用HttpUrlFetcher.getid()->>分析19

EngineKey?key?=?keyFactory.buildKey(id,?signature,?width,?height,?loadProvider.getCacheDecoder(),loadProvider.getSourceDecoder(),?transformation,?loadProvider.getEncoder(),transcoder,?loadProvider.getSourceEncoder());

//?將該id?和?signature、width、height等10個參數(shù)一起傳入到緩存Key的工廠方法里,最終創(chuàng)建出一個EngineKey對象

//?創(chuàng)建原理:通過重寫equals()?和?hashCode(),保證只有傳入EngineKey的所有參數(shù)都相同情況下才認(rèn)為是同一個EngineKey對象

//?該EngineKey?即Glide中的緩存Key

...

}

public?class?HttpUrlFetcher?implements?DataFetcher?{

...

private?final?GlideUrl?glideUrl;

//?GlideUrl?=?在上篇文章講解?圖片加載?第2步load()中傳入圖片url地址時,Glide在內(nèi)部把圖片url地址包裝成一個GlideUrl對象

@Override

public?String?getId()?{

return?glideUrl.getCacheKey();

//?->>分析20

}

public?class?GlideUrl?{

private?final?URL?url;

private?final?String?stringUrl;

...

//?GlideUrl構(gòu)造函數(shù)

public?GlideUrl(URL?url)?{

this(url,?Headers.DEFAULT);

}

public?GlideUrl(String?url)?{

this(url,?Headers.DEFAULT);

}

public?String?getCacheKey()?{

return?stringUrl?!=?null???stringUrl?:?url.toString();

//?在生成GlideUrl對象時:

//?若傳入的是URL字符串(即圖片地址),就直接返回該字符串(大多數(shù)是這種情況)

//?若傳入的是URL對象,那么就返回這個對象toString()后的結(jié)果。

}

...

}

3.3 實現(xiàn)方案

即 我們只需重寫getCacheKey() & 將 帶有token參數(shù)的圖片Url地址 去掉 token參數(shù) 即可。/**

*?代碼實現(xiàn):創(chuàng)建一個GlideUrl類的子類?&?重寫getCacheKey()

**/

//?1.?繼承GlideUrl

public?class?mGlideUrl?extends?GlideUrl?{

private?String?mUrl;

//?構(gòu)造函數(shù)里?傳入?帶有token參數(shù)的圖片Url地址

public?MyGlideUrl(String?url)?{

super(url);

mUrl?=?url;

}

//?2.?重寫getCacheKey()

@Override

public?String?getCacheKey()?{

return?mUrl.replace(deleteToken(),?"");

//?通過?deleteToken()?從?帶有token參數(shù)的圖片Url地址中?去掉?token參數(shù)

//?最終返回一個沒有token參數(shù)、初始的圖片URL地址

//?->>分析1

}

//?分析1:deleteToken()

private?String?deleteToken()?{

String?tokenParam?=?"";

int?tokenKeyIndex?=?mUrl.indexOf("?token=")?>=?0???mUrl.indexOf("?token=")?:?mUrl.indexOf("&token=");

if?(tokenKeyIndex?!=?-1)?{

int?nextAndIndex?=?mUrl.indexOf("&",?tokenKeyIndex?+?1);

if?(nextAndIndex?!=?-1)?{

tokenParam?=?mUrl.substring(tokenKeyIndex?+?1,?nextAndIndex?+?1);

}?else?{

tokenParam?=?mUrl.substring(tokenKeyIndex);

}

}

return?tokenParam;

}

}

/**

*?使用緩存時:需要在load()中傳入自定義的?mGlideUrl對象

**/

Glide.with(this)

.load(new?mGlideUrl(url))

.into(imageView);

//?注:a.?若像之前直接傳入圖片的url地址,那么在內(nèi)部還是會使用原始的GlideUrl類

//????b.?即直接將傳入傳入圖片的url地址作為緩存key的Id參數(shù),而沒有對token參數(shù)作任何處理

4. 總結(jié)本文主要對Glide的圖片緩存功能的使用問題進(jìn)行講解

總結(jié)

以上是生活随笔為你收集整理的android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人啪啪 | 这里只有精品999 | 欧美日韩一本 | 国产精品v亚洲精品v日韩精品 | 深夜av | 成人午夜在线 | 明星双性精跪趴灌满h | 那个网站可以看毛片 | 欧美日韩中文字幕一区二区 | 亚洲av最新在线网址 | 女生被草| 久久亚洲一区二区三区四区五区 | 非洲黑人毛片 | 美腿丝袜av | 毛片网站在线 | 超碰按摩 | 最近中文字幕在线观看 | 一本久久综合亚洲鲁鲁五月天 | 久久国语对白 | 欧美成人专区 | 手机在线看片你懂的 | 国产精品成人久久久久久久 | 一二三区精品视频 | www.4虎| 91香蕉视频在线 | 在线日韩精品视频 | 久久国产免费观看 | 日韩美女爱爱 | 色综合狠狠爱 | 男人爱看的网站 | 亚洲精品国产精品乱码不卡 | 放荡的美妇在线播放 | 国产成人精品一区二区三区无码熬 | 久久不卡区 | 九色porny自拍 | 99热黄色| 91精品免费在线观看 | 日本一二三区在线视频 | 黄色香蕉软件 | 久久久久99精品成人片直播 | 国产成人无码性教育视频 | 欧美日韩亚洲国产综合 | 国产精品免费久久久久 | 欧美女同在线 | 亚洲s码欧洲m码国产av | 久久免费国产精品 | 深夜福利在线免费观看 | 亚洲欲| 原创少妇半推半就88av | 精品乱码一区二区三区 | 精品二区视频 | 国产18禁黄网站免费观看 | 国产精品人人 | 国产欧美日韩三区 | 日日夜夜网站 | 中文字幕av免费在线观看 | 日本三级韩国三级三级a级按摩 | 亚洲成人激情视频 | 日韩免费观看 | 午夜激情视频在线播放 | 美脚の诱脚舐め脚 | 老头老太吃奶xb视频 | 亚洲一区影视 | 欧美色精品在线 | 国产又粗又猛又黄又爽视频 | av少妇| 免费观看高清在线 | 妻色成人网 | 青青草这里只有精品 | 日韩欧美高清片 | 草久久久 | 亚洲性精品 | 国产全肉乱妇杂乱视频 | 精品少妇一区二区三区免费观 | 久久久中文网 | 免费久久一级欧美特大黄 | 中文字幕av一区二区三区 | 国产真实乱人偷精品视频 | 毛利兰被扒开腿做同人漫画 | 日韩免费精品 | 99精品视频网站 | 99国产精品99久久久久久 | 亚洲午夜精品久久久久久app | 91亚洲精品国偷拍自产在线观看 | 人人爱人人艹 | 国模视频在线 | 精品女同一区二区三区 | 欧美老女人性视频 | 国产精选一区二区 | 欧美日韩在线一区 | 原神淫辱系列同人h | 免费在线一级片 | 在线观看网站av | 国产思思99re99在线观看 | 中文字幕在线播放不卡 | 午夜一级在线 | 青春草视频在线免费观看 | 天天射日日操 | 午夜手机福利 |