点击RecyclerView Adapter中跳转外部网站按钮时App崩溃求助
问题原因
该空指针异常是BookImagesAdapter中持有的全局Context引用为空导致的,触发场景多为:用户点击按钮时,关联的BookImages Activity已经销毁(如用户刚按下返回键退出页面),此时存储的全局Context引用已被释放,调用startActivity就会触发空指针。
修复方法
最优方案:使用点击控件自带的Context(无需依赖全局Context引用)
修改onBindViewHolder中Amazon按钮的点击逻辑,直接用点击事件传入的view获取Context即可,修改后的代码如下:
@Override protected void onBindViewHolder(@NonNull ImagesViewHolder holder, int position, @NonNull BookImagesModel model) { Glide.with(holder.Image.getContext()).load(model.getImage()).into(holder.Image); holder.Amazon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String amazonUrl = model.getAmazon(); // 额外加链接非空判断,避免解析异常 if (amazonUrl == null || amazonUrl.trim().isEmpty()) { return; } Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(amazonUrl)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 直接用点击控件的Context,触发点击时控件必然依附于窗口,Context不会为空 view.getContext().startActivity(intent); } }); }
如果后续需要给Flipkart按钮加同类跳转逻辑,也采用相同写法即可。
兜底方案:给全局Context加空校验
如果需要保留现有全局Context的写法,仅需在调用startActivity前增加非空判断即可:
@Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(model.getAmazon())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (context != null) { context.startActivity(intent); } }
内容的提问来源于stack exchange,提问作者user16711150
相关产品推荐
相关产品推荐

