Android中onActivityResult内添加元素至ArrayList遇空指针问题求助
解决onActivityResult中ArrayList空指针崩溃的问题
嘿,我来帮你搞定这个头疼的崩溃问题!先直接说核心原因:你的imageInfoArray列表被初始化为null了,而且用了val修饰,导致后续根本没法初始化它,调用add()方法自然就会抛出空指针异常。
问题拆解
看你这段代码:
val imageInfoArray: ArrayList<String?>? = null
这里有两个致命问题:
- 你把列表直接初始化为
null,没有创建实际的ArrayList实例,调用add()时肯定会触发空指针 - 用
val修饰变量,意味着这个变量的引用不能被修改,就算你想之后给它赋值一个新的ArrayList也做不到
而你用var mId没问题,是因为var允许你直接给变量赋值新的字符串引用,不需要调用对象的方法,自然不会触发空指针。
修复方案
第一步:正确初始化ArrayList
把列表改成非空的可变ArrayList,推荐用val修饰引用(因为我们只需要集合本身可变,引用不需要变),直接初始化:
// 直接创建ArrayList实例,类型匹配你要存储的URI字符串 private val imageInfoArray = arrayListOf<String?>()
如果你的Info是自定义数据类(比如用来封装URI和ID),那要把列表类型改成对应的:
// 假设Info是你的自定义数据类 private val imageInfoArray = arrayListOf<Info>()
第二步:修正add方法的类型匹配
你代码里写了imageInfoArray.add(Info(mId)),但如果列表是ArrayList<String?>,这里类型不匹配也会报错。如果是存储URI字符串,直接添加mId即可:
imageInfoArray.add(mId)
如果是用自定义Info类,那确保列表类型是ArrayList<Info>,再添加实例:
imageInfoArray.add(Info(mId))
完整修复后的代码示例
class SellActivity : AppCompatActivity() { private val imgResult = 1 // 正确初始化可变ArrayList private val imageInfoArray = arrayListOf<String?>() var mId: String? = null override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == imgResult && resultCode == RESULT_OK && data != null) { data.data?.also { uri -> mId = uri.toString() // 添加URI到列表 imageInfoArray.add(mId) } } } // 后续在上传方法中使用列表里的URI private fun uploadImagesAndSendIds() { // 遍历所有存储的URI,执行上传逻辑 for (uriStr in imageInfoArray) { uriStr?.let { uri -> // 这里写上传图片到服务器、获取ID并发送的代码 // 比如调用上传接口,处理返回的ID等 } } } }
进阶优化:避免Activity重建丢失数据
如果你的Activity可能发生重建(比如旋转屏幕),上面的列表数据会丢失。推荐用ViewModel来存储数据,这样在Activity生命周期变化时数据能保留:
// 定义ViewModel存储数据 class SellViewModel : ViewModel() { val imageInfoArray = arrayListOf<String?>() } // 在SellActivity中使用ViewModel class SellActivity : AppCompatActivity() { // 通过viewModels()获取ViewModel实例 private val viewModel: SellViewModel by viewModels() private val imgResult = 1 var mId: String? = null override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == imgResult && resultCode == RESULT_OK && data != null) { data.data?.also { uri -> mId = uri.toString() // 把数据存在ViewModel的列表里 viewModel.imageInfoArray.add(mId) } } } private fun uploadImagesAndSendIds() { // 从ViewModel中获取列表数据 for (uriStr in viewModel.imageInfoArray) { uriStr?.let { uri -> // 上传逻辑 } } } }
关于单例崩溃的补充
你说用单例也会崩溃,大概率是单例里的列表同样没有正确初始化,或者在多线程场景下出现问题。按照上面的方式,先确保单例里的列表是已初始化的可变集合,再尝试添加数据,应该就能解决。
内容的提问来源于stack exchange,提问作者Ulises
相关产品推荐
相关产品推荐

