RecyclerView Adapter内Glide加载图片报getActivity为null错误如何解决
问题根因
你遇到的报错核心原因是:Adapter中传入Glide的上下文ct来自已销毁的Fragment。点击保存后你调用了popBackStack()将当前Fragment销毁回收,但此时RecyclerView可能还有未完成的条目绑定任务,此时Fragment已经和Activity解绑,你传入的上下文已经无效,Glide校验不通过就抛出该异常。
最优解决方案
直接修改Adapter中Glide的调用方式,不要传入外部的Context对象,改为传入目标ImageView实例即可,无需额外校验:
@Override public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) { Uri uri = Uri.parse(rems.get(position).getImages()); // 把原来的Glide.with(ct)替换为传入ImageView实例 Glide.with(holder.binding.imageView) .load(new File(uri.getPath())) .into(holder.binding.imageView); holder.binding.textrow.setText(rems.get(position).getTextRem()); holder.binding.daterow.setText(rems.get(position).getDateRem()); holder.binding.isdone.setChecked(rems.get(position).isDone()); }
该方案的优势:
- Glide会自动感知View的附着状态:如果ImageView还没attach到Window、或者所属页面已经销毁,Glide会自动跳过加载不会抛出异常
- 自动关联页面生命周期,页面销毁时会自动取消未完成的图片加载请求,避免内存泄漏
备选兜底方案
如果因为特殊原因不能用上述方案,可以增加两层校验避免崩溃:
- 在宿主Fragment的
onDestroyView生命周期中,清空Adapter数据并通知刷新,避免销毁后还执行条目绑定:
@Override public void onDestroyView() { super.onDestroyView(); reminderAdapter.setData(Collections.emptyList()); reminderAdapter.notifyDataSetChanged(); }
- 在
onBindViewHolder中先判断上下文有效性再加载图片:
@Override public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) { Uri uri = Uri.parse(rems.get(position).getImages()); if (ct != null && !(ct instanceof Activity && ((Activity) ct).isFinishing() && ((Activity) ct).isDestroyed())) { Glide.with(ct).load(new File(uri.getPath())).into(holder.binding.imageView); } // 其他绑定逻辑不变 }
内容的提问来源于stack exchange,提问作者Spectator
相关产品推荐
相关产品推荐

