Android Kotlin调用Breaking Bad API出现类型不匹配报错如何解决
问题根因
characterData类型为MutableList<ResponseBBItem>,要求所有元素都是非空的ResponseBBItem- 待添加的
characterList.responseBB类型为List<ResponseBBItem?>?,存在两个可空层级:整个列表本身可能为空、列表内的单个元素也可能为空
两种类型不匹配,因此触发编译错误。
修复方案
1. 直接修复报错行
替换报错的characterData.addAll(characterList.responseBB!!)代码为以下内容,先过滤空元素再执行添加操作,同时规避不安全的!!断言:
characterList.responseBB?.filterNotNull()?.let { validItems -> characterData.addAll(validItems) }
逻辑说明:
- 先用
?.安全调用判断responseBB本身是否为空 - 用
filterNotNull()过滤掉列表里所有空的ResponseBBItem元素,得到类型为List<ResponseBBItem>的合法列表 - 用
let确保只有列表不为空的时候才执行添加操作
2. 可选优化(建议修改)
模型类优化
如果你确认API返回的列表里不会出现空元素,可以直接修改ResponseBB的字段定义,减少不必要的可空层级:
data class ResponseBB( @field:SerializedName("ResponseBB") val responseBB: List<ResponseBBItem>? = null // 移除元素的可空标识 )
适配器优化
当前适配器里大量使用!!断言获取元素,存在崩溃风险,建议对应调整适配器的入参类型为非空列表:
// 适配器定义修改 class MyAdapter(var listChar : List<ResponseBBItem>, val context : Context) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() // 绑定逻辑同步修改,无需再用!!断言 override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val item = listChar[position] holder.appearance.text = item.appearance.toString() holder.name.text = item.name holder.occupation.text = item.occupation.toString() holder.protrayed.text = item.portrayed holder.status.text = item.status Picasso.get().load(item.img).into(holder.image) }
协程优化
不建议使用GlobalScope,可以换成lifecycleScope绑定Activity生命周期,避免页面销毁后协程继续执行导致内存泄漏。
内容的提问来源于stack exchange,提问作者Arpit Gupta
相关产品推荐
相关产品推荐

