目錄
2.快取Key
#3.記憶體快取
硬碟快取
進階技巧
首頁 类库下载 java类库 深入探討Glide的快取機制

深入探討Glide的快取機制

Sep 14, 2018 am 10:29 AM

開始之前,我們需要將xerces.jar 和 xalan.jar檔案放入java.class.path目錄下(這兩個檔案包含在Xalan-Java 1.2 中,可以從xml.apache.org處下載)。

1.Glide快取簡介

2.快取Key

EngineKey

重寫了equals()和hashCode()方法,保證只有傳入EngineKey的所有參數都相同的情況下才認為是同一個EngineKey物件

#3.記憶體快取

Glide.with(this)
     .load(url)
     .skipMemoryCache(true)
     .into(imageView);

LruCache演算法(Least Recently Used)
Android高效載入大圖、多圖解決方案,有效避免程式OOM

很容易就讓人想到LruCache演算法(Least Recently Used),也叫近期最少使用演算法。它的主要演算法原理就是把最近使用的物件用強引用儲存在LinkedHashMap中,並且把最近最少使用的物件在快取值達到預設定值之前從記憶體中移除。 LruCache的用法也比較簡單
 loadFromCache()方法來取得快取圖片,如果取得到就直接呼叫cb.onResourceReady()方法進行回呼。如果沒有取得到,則會在第26行呼叫loadFromActiveResources()方法來取得快取圖片,取得到的話也直接進行回調。只有在兩個方法都沒有取得到快取的情況下,才會繼續向下執行,從而開啟執行緒來載入圖片。

loadFromCache()和loadFromActiveResources()。這兩個方法中一個使用的就是LruCache演算法,另一個使用的就是弱引用。

硬碟快取

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

DiskCacheStrategy.NONE: 表示不快取任何內容。
 DiskCacheStrategy.SOURCE: 表示只快取原始圖片。
 DiskCacheStrategy.RESULT: 表示只快取轉換過後的圖片(預設選項)。
 DiskCacheStrategy.ALL : 表示既快取原始圖片,也快取轉換過後的圖片。

DiskLruCache
Android DiskLruCache完全解析,硬碟快取的最佳方案

private Resource<?> decode() throws Exception {    if (isDecodingFromCache()) {        return decodeFromCache();
    } else {        return decodeFromSource();
    }
}

這裡會先去呼叫DecodeJob的decodeResultFromCache()方法來取得緩存,如果取得不到,會再呼叫decodeSourceFromCache()方法取得緩存,這兩個方法的差別其實就是DiskCacheStrategy.RESULT和DiskCacheStrategy.SOURCE這兩個參數的差別,相信不需要我再做什麼解釋。

進階技巧

例如之前有一位群組裡的朋友就跟我說過,他們專案的圖片資源都是存放在七牛雲上面的,而七牛雲為了對圖片資源進行保護,會在圖片url位址的基礎之上再加上一個token參數。也就是說,一張圖片的url位址可能會是以下格式:
http://url.com/image.jpg?token=d9caa6e02c990b0a

public class MyGlideUrl extends GlideUrl {

    private String mUrl;    public MyGlideUrl(String url) {        super(url);
        mUrl = url;
    }    @Override
    public String getCacheKey() {        return mUrl.replace(findTokenParam(), "");
    }    private String findTokenParam() {
        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;
    }

}
Glide.with(this)
     .load(new MyGlideUrl(url))
     .into(imageView);

相關推薦:

PHP實作java中的DatainputStream類別.

Java連接mysql的方法_MySQL


以上是深入探討Glide的快取機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1604
29
PHP教程
1509
276
Edge PDF查看器不起作用 Edge PDF查看器不起作用 Aug 07, 2025 pm 04:36 PM

testthepdfinanotherapptoderineiftheissueiswiththefileoredge.2.enablethebuilt inpdfviewerbyTurningOff“ eflblyopenpenpenpenpenpdffilesexternally”和“ downloadpdffiles” inedgesettings.3.clearbrowsingdatainclorwearbrowsingdataincludingcookiesandcachedcachedfileresteroresoreloresorelorsolesoresolesoresolvereresoreorsolvereresoreolversorelesoresolvererverenn

如何在Java中實現簡單的TCP客戶端? 如何在Java中實現簡單的TCP客戶端? Aug 08, 2025 pm 03:56 PM

Importjava.ioandjava.net.SocketforI/Oandsocketcommunication.2.CreateaSocketobjecttoconnecttotheserverusinghostnameandport.3.UsePrintWritertosenddataviaoutputstreamandBufferedReadertoreadserverresponsesfrominputstream.4.Usetry-with-resourcestoautomati

用Docker將Java應用程序部署到Kubernetes 用Docker將Java應用程序部署到Kubernetes Aug 08, 2025 pm 02:45 PM

容器化Java應用:創建Dockerfile,使用基礎鏡像如eclipse-temurin:17-jre-alpine,複製JAR文件並定義啟動命令,通過dockerbuild構建鏡像並用dockerrun測試本地運行。 2.推送鏡像到容器註冊表:使用dockertag標記鏡像並推送到DockerHub等註冊表,需先登錄dockerlogin。 3.部署到Kubernetes:編寫deployment.yaml定義Deployment,設置副本數、容器鏡像和資源限制,編寫service.yaml創建

VS代碼快捷方式專注於Explorer面板 VS代碼快捷方式專注於Explorer面板 Aug 08, 2025 am 04:00 AM

VSCode中可通過快捷鍵快速切換面板與編輯區。要跳轉至左側資源管理器面板,使用Ctrl Shift E(Windows/Linux)或Cmd Shift E(Mac);返回編輯區可用Ctrl `或Esc或Ctrl 1~9。相比鼠標操作,鍵盤快捷鍵更高效且不打斷編碼節奏。其他技巧包括:Ctrl KCtrl E聚焦搜索框,F2重命名文件,Delete刪除文件,Enter打開文件,方向鍵展開/收起文件夾。

修復:Windows Update無法安裝 修復:Windows Update無法安裝 Aug 08, 2025 pm 04:16 PM

runthewindowsupdatetrubloubleshooterviaSettings>更新&安全> is esseShootsoAtomationfixCommonissues.2.ResetWindowSupDateComponentsByStoppingRealatedServices,RenamingTheSoftWaredWaredWaredSoftwaredSistribution andCatroot2Folders,intrestrestartingthertingthertingtherserviceSteStoceTocle

如何在Java中使用一個時循環 如何在Java中使用一個時循環 Aug 08, 2025 pm 04:04 PM

AwhileloopinJavarepeatedlyexecutescodeaslongastheconditionistrue;2.Initializeacontrolvariablebeforetheloop;3.Definetheloopconditionusingabooleanexpression;4.Updatethecontrolvariableinsidethelooptopreventinfinitelooping;5.Useexampleslikeprintingnumber

Java對象的序列化過程是什麼? Java對象的序列化過程是什麼? Aug 08, 2025 pm 04:03 PM

JavaserializationConvertSanObject'SstateIntoAbyTeSteAmForStorageorTransermission,andDeserializationReconstructstheObjectStheObjectFromThstream.1.toenableserialization,aclassMustimustimplementTheSerializableizableface.2.UseObjectObjectObjectObjectOutputputputputputtreamToserialializeanobectizeanobectementeabectenobexpent,savin

python numpy線性代數示例 python numpy線性代數示例 Aug 07, 2025 pm 04:52 PM

NumPy是Python中進行科學計算的核心庫,擅長處理線性代數運算,提供高效的ndarray數組和numpy.linalg模塊中的函數。 1.使用np.linalg.solve(A,b)可求解線性方程組Ax=b,得到解向量x;2.矩陣轉置通過A.T實現;3.矩陣乘法可用np.dot(A,B)或A@B;4.矩陣逆通過np.linalg.inv(A)計算,需確保矩陣可逆;5.行列式由np.linalg.det(A)給出;6.特徵值與特徵向量通過np.linalg.eig(A)求得,特徵向量已歸一化;

See all articles