如何使用Glide下载图片返回Drawable/Bitmap 分离下载与加载流程
拆分Glide下载与加载流程实现父类通用图片方法
你原有的写法是把图片下载、变换、绑定ImageView的流程全耦合在链式调用里,要拆分的话可以通过Glide的自定义Target拿到加载完成的资源,再交给子类自行处理,完全适配你要的父类通用逻辑。
异步实现(推荐,不会阻塞UI)
异步方案通过回调返回加载结果,是Android场景下的首选,不会触发主线程卡顿、ANR问题。
- 首先在父类中定义结果回调接口,供子类接收加载结果
public interface ImageLoadCallback { void onLoadSuccess(Drawable drawable); void onLoadFailed(@Nullable Drawable errorDrawable); }
- 在父类中实现通用下载方法,只做资源下载和基础配置,不直接绑定ImageView
/** * 通用图片下载方法 * @param url 图片资源地址 * @param targetWidth 目标图片宽度,传Target.SIZE_ORIGINAL可加载原图尺寸 * @param targetHeight 目标图片高度 * @param callback 加载结果回调,默认在主线程触发 */ protected void fetchImage(String url, int targetWidth, int targetHeight, ImageLoadCallback callback) { Glide.with(this) // 若父类是Activity/Fragment直接传this即可自动绑定生命周期,避免内存泄漏;如果要全局通用就传getApplicationContext() .load(url) .centerCrop() // 通用图片变换可以直接写在父类,也可以把变换作为参数透传供子类自定义 .into(new CustomTarget<Drawable>(targetWidth, targetHeight) { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { callback.onLoadSuccess(resource); } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 页面销毁、资源被回收时触发,可按需处理占位逻辑 } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { super.onLoadFailed(errorDrawable); callback.onLoadFailed(errorDrawable); } }); }
- 子类按需调用通用方法,拿到结果后自行处理ImageView设置或者其他自定义逻辑
// 对应你原有逻辑的调用示例 fetchImage(urls.get(0), imageView1.getWidth(), imageView1.getHeight(), new ImageLoadCallback() { @Override public void onLoadSuccess(Drawable drawable) { imageView1.setImageDrawable(drawable); // 子类可在此扩展自定义逻辑,比如加圆角动画、存本地缓存、做滤镜处理等 } @Override public void onLoadFailed(Drawable errorDrawable) { imageView1.setImageDrawable(errorDrawable); } });
同步获取方式(仅适合子线程场景)
如果你需要在子线程中拿到资源做额外处理,可以用submit()方法同步获取结果,注意这个方法绝对不能在主线程调用,会触发NetworkOnMainThread异常甚至ANR:
// 子线程中同步获取示例 new Thread(() -> { try { Drawable drawable = Glide.with(getApplicationContext()) .load(url) .centerCrop() .submit(targetWidth, targetHeight) .get(); // 切回主线程再操作UI runOnUiThread(() -> imageView1.setImageDrawable(drawable)); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }).start();
注意事项
- 调用时传入目标ImageView的实际宽高,Glide会按尺寸加载采样后的图片,避免直接加载原图导致的OOM问题
- Glide.with()传入对应页面的Activity/Fragment实例时,会自动在页面销毁时取消加载任务,不需要手动处理生命周期
- 通用方法可以按需扩展参数,比如占位图、错误图、自定义变换规则,子类调用时传入即可,灵活度很高
内容的提问来源于stack exchange,提问作者user3797829
相关产品推荐
相关产品推荐

