You need to enable JavaScript to run this app. Android Kotlin startActivityForResult回传更新RecyclerView的空指针异常
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 07:36:03