如何調試Glide加載圖片

jopen 9年前發布 | 41K 次閱讀 Glide Android開發 移動開發

原文出處: 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加載圖片

為了查看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
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!