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

Android Studio中如何使用Glide实现CardView图片懒加载

CardView 内 Glide 图片懒加载实现方案

现有代码问题

你当前的写法完全无法实现懒加载,核心问题有两个:

  • 调用futureTarget.get()是同步阻塞线程的取图逻辑,必须手动放在子线程执行,放在主线程会直接触发ANR,而且这种写法是给通知栏、桌面组件等无法直接绑定ImageView的场景设计的,不适合普通页面内的图片加载。
  • 这种手动提前拉取Bitmap的写法,完全绕过了Glide自带的生命周期绑定、可视区域检测能力,根本不会判断图片所在的CardView是否已经进入用户可视范围,自然做不到懒加载。

懒加载代码放置位置

CardView绝大多数场景下是作为RecyclerView列表的item布局存在的,懒加载逻辑不需要提前预拉取Bitmap,直接写在RecyclerView适配器的onBindViewHolder生命周期方法中即可。Glide本身已经内置了懒加载能力:自动检测绑定的ImageView是否在可视区域,不可见时自动暂停加载,滑入可视范围后自动恢复加载,不需要你手动写判断逻辑。

如果你的CardView是放在普通静态布局里,直接在页面的onCreate/onViewCreated生命周期里调用Glide加载即可,Glide会自动在页面可见时才发起请求,不会提前加载不可见的资源。

正确实现代码

1. 基础懒加载实现(默认效果)

删除你现在写的两个同步返回Bitmap的方法,直接把加载逻辑绑定到CardView内的ImageView控件上:

// 以下代码写在RecyclerView.Adapter的onBindViewHolder方法中
@Override
public void onBindViewHolder(@NonNull CardViewHolder holder, int position) {
    // 拿到当前item对应的图片路径
    String pathName = dataList.get(position).getImagePath();
    Glide.with(holder.itemView.getContext())
            .load(Constants.IMAGE_DOWNLOAD + pathName)
            // 加载中显示的占位图,避免布局空白
            .placeholder(R.drawable.default_img_placeholder)
            // 加载失败显示的兜底图
            .error(R.drawable.default_img_error)
            // 磁盘缓存全量缓存,避免重复拉取
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            // 直接加载到CardView内的ImageView,不需要手动返回Bitmap
            .into(holder.ivCardCover);
}

2. 激进懒加载(滚动时完全不加载,停止滑动后再加载)

如果需要更极致的懒加载效果,给RecyclerView添加滚动监听,滚动时暂停所有加载请求,停止后再恢复:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            // 列表停止滚动,恢复加载
            Glide.with(recyclerView.getContext()).resumeRequests();
        } else {
            // 列表滚动中,暂停所有非必要加载
            Glide.with(recyclerView.getContext()).pauseRequests();
        }
    }
});

注意事项

  • 不要在非特殊场景下使用into(宽高)+FutureTarget.get()的同步取图方式,会丢失Glide的所有生命周期管理、内存优化能力。
  • Glide.with()方法尽量传当前控件的上下文(比如itemView的context、Fragment/Activity实例),不要传全局Application上下文,否则会无法绑定页面生命周期,做不到页面退出时自动取消请求的优化。

内容的提问来源于stack exchange,提问作者suraj gaikwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:27:34