前言
與其他圖片加載庫不同,在Glide加載圖片的過程中默認(rèn)是沒有任何log輸出的。這樣使得加載失敗的原因難以調(diào)試。到底是網(wǎng)絡(luò)錯(cuò)誤還是圖片根本就不存在亦或者解碼出錯(cuò),我們不得而知。當(dāng)然官方也給出了調(diào)試的方法,這篇文章就來介紹下如何調(diào)試Glide加載圖片,內(nèi)容主要是對(duì)官方wiki的翻譯。
正文
在Glide加載圖片過程中出現(xiàn)異常時(shí),默認(rèn)是沒有l(wèi)og輸出的。但是Glide給開發(fā)者提供了兩種方法來查看或者響應(yīng)這些異常。
調(diào)試
為了在異常發(fā)生時(shí)可以看到它們,你可以打開Glide中處理所有媒體加載響應(yīng)的類GenericRequest的log開關(guān)。很簡單,在命令行運(yùn)行下面的指令即可:
adb shell setprop log.tag.GenericRequest DEBUG
如果你將DEBUG替換為VERBOSE,還可以看到詳細(xì)的請(qǐng)求時(shí)間日志。
如果你想禁用log輸出,執(zhí)行:
adb shell setprop log.tag.GenericRequest ERROR
調(diào)試工作流

為了查看Glide內(nèi)部引擎是何時(shí)、如何加載圖片的,你可以啟用這些log:
adb shell setprop log.tag.Engine VERBOSE
adb shell setprop log.tag.EngineJob VERBOSE
adb shell setprop log.tag.DecodeJob VERBOSE
啟用這些log可以幫助你了解到為什么某些資源沒有從內(nèi)存中加載?為什么從外部url加載要重新下載數(shù)據(jù)?同時(shí)這也有助于了解在磁盤緩存時(shí)哪些參數(shù)需要配置。啟用DecodeJob log還可以幫助你了解自定義變換/解碼器/編碼器等相關(guān)問題。
請(qǐng)求監(jiān)聽器
雖然啟動(dòng)調(diào)試日志很簡單,但前提是你可以訪問到設(shè)備。為了完善Glide已存在或更復(fù)雜的錯(cuò)誤日志系統(tǒng),你可以使用RequestListener類。當(dāng)加載請(qǐng)求失敗時(shí)onException()方法就會(huì)被調(diào)用,并給出造成失敗的異?;蛘遪ull(在解碼器無法從它獲取到的數(shù)據(jù)中解碼出任何有用的東西時(shí))。你可以通過listener() API為每一個(gè)請(qǐng)求添加一個(gè)監(jiān)聽器。
確保onException()方法的返回值為false,避免覆蓋Glide默認(rèn)的錯(cuò)誤處理(比如加載失敗的錯(cuò)誤圖片占位)。
這里有一個(gè)實(shí)現(xiàn)快速調(diào)試的列子:
// 示例: .listener(new LoggingListener<String, GlideDrawable>())
public class LoggingListener<T, R> implements RequestListener<T, R> {
@Override public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) {
android.util.Log.d("GLIDE", String.format(Locale.ROOT,
"onException(%s, %s, %s, %s)", e, model, target, isFirstResource), e);
return false;
}
@Override public boolean onResourceReady(Object resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
android.util.Log.d("GLIDE", String.format(Locale.ROOT,
"onResourceReady(%s, %s, %s, %s, %s)", resource, model, target, isFromMemoryCache, isFirstResource));
return false;
}
}
確保在發(fā)布應(yīng)用時(shí)移除掉所有的調(diào)試log!
更多的log指令
這個(gè)列表是基于Glide 3.6.0版本的,并不完整。
cd .../android-sdk/platform-tools
adb shell setprop log.tag.AnimatedGifEncoder VERBOSE
adb shell setprop log.tag.AssetUriFetcher VERBOSE
adb shell setprop log.tag.BitmapEncoder VERBOSE
adb shell setprop log.tag.BufferedIs VERBOSE
adb shell setprop log.tag.ByteArrayPool VERBOSE
adb shell setprop log.tag.CacheLoader VERBOSE
adb shell setprop log.tag.ContentLengthStream VERBOSE
adb shell setprop log.tag.DecodeJob VERBOSE
adb shell setprop log.tag.DiskLruCacheWrapper VERBOSE
adb shell setprop log.tag.Downsampler VERBOSE
adb shell setprop log.tag.Engine VERBOSE
adb shell setprop log.tag.EngineRunnable VERBOSE
adb shell setprop log.tag.GenericRequest VERBOSE
adb shell setprop log.tag.GifDecoder VERBOSE
adb shell setprop log.tag.GifEncoder VERBOSE
adb shell setprop log.tag.GifHeaderParser VERBOSE
adb shell setprop log.tag.GifResourceDecoder VERBOSE
adb shell setprop log.tag.Glide VERBOSE
adb shell setprop log.tag.ImageHeaderParser VERBOSE
adb shell setprop log.tag.ImageVideoDecoder VERBOSE
adb shell setprop log.tag.IVML VERBOSE
adb shell setprop log.tag.LocalUriFetcher VERBOSE
adb shell setprop log.tag.LruBitmapPool VERBOSE
adb shell setprop log.tag.MediaStoreThumbFetcher VERBOSE
adb shell setprop log.tag.MemorySizeCalculator VERBOSE
adb shell setprop log.tag.PreFillRunner VERBOSE
adb shell setprop log.tag.ResourceLoader VERBOSE
adb shell setprop log.tag.RMRetriever VERBOSE
adb shell setprop log.tag.StreamEncoder VERBOSE
adb shell setprop log.tag.TransformationUtils VERBOSE