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
相关产品推荐
相关产品推荐

