如何调试Glide加载图片
####前言与其他图片加载库不同,在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