Android Kotlin startActivityForResult回传更新RecyclerView的空指针异常
崩溃根因排查
本次在
onActivityResult阶段触发的KotlinNullPointerException,结合当前的交互逻辑,必然是取值或对象引用环节存在未做判空的场景,常见触发点集中在三处:
- 返回值取值不匹配:PizzaActivity回传Intent的key和OrderActivity里取值的key拼写不一致,取出来的值本身就是null,直接用
!!强解引发崩溃 - 列表/Adapter实例失效:OrderActivity因为配置变更、系统内存回收被销毁重建后,之前初始化的Adapter、订单列表数据源没有重新初始化,直接往列表里加元素时碰到空引用
- 临时餐品信息丢失:启动PizzaActivity时存在OrderActivity成员变量里的玛格丽特披萨基础信息,在页面被回收后被置空,返回组装订单时取到null
可落地的修复步骤
1. 重写onActivityResult的取值逻辑,全链路加判空保护
把原来裸取返回值的代码全部替换成带兜底的写法,从根源避免空指针:
companion object { private const val REQUEST_CODE_MARGHERITA = 1001 private const val EXTRA_PIZZA_SIZE = "extra_pizza_size" private const val EXTRA_PIZZA_TOPPING = "extra_pizza_topping" } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) // 先做基础校验,不匹配直接跳过 if (requestCode != REQUEST_CODE_MARGHERITA || resultCode != Activity.RESULT_OK) return // 对返回Intent做非空判断,空的话直接终止流程 val resultIntent = data ?: return // 取值全部加默认兜底,不再用!!强解 val pizzaSize = resultIntent.getStringExtra(EXTRA_PIZZA_SIZE) ?: "9寸" val selectedToppings = resultIntent.getStringArrayListExtra(EXTRA_PIZZA_TOPPING) ?: arrayListOf() }
注意:必须保证PizzaActivity回传数据时的key和上面定义的常量完全一致,从源头避免key不匹配导致的null
2. 加固订单列表的更新流程
很多人容易跳过初始化校验直接更新列表,导致空引用:
- 确保订单数据源、Adapter都是在
onCreate里完成初始化的,不要依赖跳转回来的延迟初始化 - 组装完成新订单条目后,严格按照列表更新流程操作:
// 组装订单实体 val newOrder = OrderItem( name = "玛格丽特披萨", size = pizzaSize, toppings = selectedToppings, price = calculatePrice(pizzaSize, selectedToppings) ) // 确认列表实例非空再添加 orderList.add(newOrder) // 通知Adapter局部更新,不要用notifyDataSetChanged影响性能 orderAdapter.notifyItemInserted(orderList.size - 1) // 自动滚动到最新条目位置 binding.rvOrder.scrollToPosition(orderList.size - 1)
3. 规避页面回收导致的临时数据丢失
当OrderActivity跳转到PizzaActivity时,如果系统内存不足会回收当前OrderActivity,等返回时会重建页面,之前存在成员变量里的临时餐品信息会被清空:
- 不要把餐品基础信息存在普通成员变量里,要么随Intent传给PizzaActivity,让PizzaActivity回传时把基础信息一并带回来;要么通过
onSaveInstanceState把关键信息保存下来,在onCreate的savedInstanceState里恢复 - 尽量减少onActivityResult里对页面成员变量的依赖,所有需要的信息优先从回传的Intent里取
内容的提问来源于stack exchange,提问作者Mick jAGGER
相关产品推荐
相关产品推荐

