如何調試Glide加載圖片
原文出處: http://www.jianshu.com/p/9bd6efca8724
前言
與其他圖片加載庫不同,在Glide加載圖片的過程中默認是沒有任何log輸出的。這樣使得加載失敗的原因難以調試。到底是網絡錯誤還是圖片根本就不存在亦或者解碼出錯,我們不得而知。當然官方也給出了調試的方法,這篇文章就來介紹下如何調試Glide加載圖片,內容主要是對官方wiki的翻譯。
正文
在Glide加載圖片過程中出現異常時,默認是沒有log輸出的。但是Glide給開發者提供了兩種方法來查看或者響應這些異常。
調試
為了在異常發生時可以看到它們,你可以打開Glide中處理所有媒體加載響應的類GenericRequest的log開關。很簡單,在命令行運行下面的指令即可:
adb shell setprop log.tag.GenericRequest DEBUG
如果你將DEBUG替換為VERBOSE,還可以看到詳細的請求時間日志。
如果你想禁用log輸出,執行:
adb shell setprop log.tag.GenericRequest ERROR
調試工作流
為了查看Glide內部引擎是何時、如何加載圖片的,你可以啟用這些log:
adb shell setprop log.tag.Engine VERBOSE adb shell setprop log.tag.EngineJob VERBOSE adb shell setprop log.tag.DecodeJob VERBOSE
啟用這些log可以幫助你了解到為什么某些資源沒有從內存中加載?為什么從外部url加載要重新下載數據?同時這也有助于了解在磁盤緩存時哪些參數需要配置。啟用DecodeJob log還可以幫助你了解自定義變換/解碼器/編碼器等相關問題。
請求監聽器
雖然啟動調試日志很簡單,但前提是你可以訪問到設備。為了完善Glide已存在或更復雜的錯誤日志系統,你可以使用RequestListener類。當加載請求失敗時onException()方法就會被調用,并給出造成失敗的異常或者null(在解碼器無法從它獲取到的數據中解碼出任何有用的東西時)。你可以通過listener() API為每一個請求添加一個監聽器。
確保onException()方法的返回值為false,避免覆蓋Glide默認的錯誤處理(比如加載失敗的錯誤圖片占位)。
這里有一個實現快速調試的列子:
// 示例: .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; } }
確保在發布應用時移除掉所有的調試log!
更多的log指令
這個列表是基于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