You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Glide下载图片返回Drawable/Bitmap 分离下载与加载流程

拆分Glide下载与加载流程实现父类通用图片方法

你原有的写法是把图片下载、变换、绑定ImageView的流程全耦合在链式调用里,要拆分的话可以通过Glide的自定义Target拿到加载完成的资源,再交给子类自行处理,完全适配你要的父类通用逻辑。

异步实现(推荐,不会阻塞UI)

异步方案通过回调返回加载结果,是Android场景下的首选,不会触发主线程卡顿、ANR问题。

  1. 首先在父类中定义结果回调接口,供子类接收加载结果
public interface ImageLoadCallback {
    void onLoadSuccess(Drawable drawable);
    void onLoadFailed(@Nullable Drawable errorDrawable);
}
  1. 在父类中实现通用下载方法,只做资源下载和基础配置,不直接绑定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);
                }
            });
}
  1. 子类按需调用通用方法,拿到结果后自行处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:06:43