Android Glide加载原图耗时过长时如何自动加载备用图片?
Glide加载图片超时自动切换备用图解决方案
问题根因
- 原有代码中
error()的使用方式错误,无需嵌套Glide加载逻辑 - Glide超时配置未正确生效,通常是版本适配问题、测试场景未规避缓存影响导致
基础解决方案(优先使用)
直接配置请求级超时,超时后自动触发error逻辑加载备用图,正确写法如下:
Glide.with(this) .load(url) .timeout(3000) // 单位为毫秒,此处设置3秒超时,可自行调整时长 .error(errorUrl) // 直接传入备用图的URL、资源ID或者Drawable即可 .into(imageView);
常见不生效排查点
- 测试时建议临时关闭内存和磁盘缓存,避免本地已缓存的资源直接返回,无法触发网络超时逻辑:
Glide.with(this) .load(url) .timeout(3000) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .error(errorUrl) .into(imageView); - 若使用Glide 3.x版本,无单独的请求级
timeout()方法,需通过自定义GlideModule配置全局网络超时。
手动超时控制方案(适配复杂场景)
如果默认超时逻辑仍不满足需求,可以通过Handler+RequestListener自行控制超时时机,灵活度更高:
int LOAD_TIMEOUT = 3000; Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable timeoutRunnable = () -> { // 超时后直接加载备用图 Glide.with(this) .load(errorUrl) .into(imageView); }; Glide.with(this) .load(url) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { mainHandler.removeCallbacks(timeoutRunnable); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { // 加载成功,移除超时任务 mainHandler.removeCallbacks(timeoutRunnable); return false; } }) .error(errorUrl) .into(imageView); // 启动超时计时 mainHandler.postDelayed(timeoutRunnable, LOAD_TIMEOUT);
注意:在页面销毁的生命周期(如
onDestroy())中需调用mainHandler.removeCallbacks(timeoutRunnable)移除未执行的任务,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Evian Pringle
相关产品推荐
相关产品推荐

