屏幕旋转时存储ArrayList数据遇Serializable/Parcelable问题,求简洁方案
解决屏幕旋转时ArrayList数据的保存与恢复问题
针对你遇到的getSerializable弃用警告和类型不匹配问题,这里提供两种简洁的解决方案,优先推荐Android官方更高效的Parcelable方案:
方案一:修复Serializable的警告与类型问题
API 33+ 中Bundle.getSerializable(String)被标记为弃用,替换为带Class参数的重载方法,同时通过安全强转避免类型不匹配异常:
保存数据
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putSerializable("time1", time1ArrayTennis) }
恢复数据
// 安全恢复,避免类型转换异常和弃用警告 val time1ArrayTennis: ArrayList<TimeArr> = savedInstanceState?.getSerializable("time1", ArrayList::class.java) as? ArrayList<TimeArr> ?: arrayListOf()
注:
?: arrayListOf()是为了在savedInstanceState为空时提供默认值,避免空指针问题。
方案二:使用Parcelable(推荐)
Parcelable是Android官方推荐的序列化方式,性能远优于Serializable,配合Kotlin的kotlin-parcelize插件可以自动生成序列化代码,非常简洁:
1. 添加插件依赖
在Module级别的build.gradle(或build.gradle.kts)中添加插件:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' // 新增此插件 }
2. 修改数据类实现Parcelable
import kotlinx.parcelize.Parcelize @Parcelize data class TimeArr( val time1: Int ) : Parcelable
3. 保存与恢复数据
// 保存数据 override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putParcelableArrayList("time1", time1ArrayTennis) } // 恢复数据(无弃用警告,类型安全) val time1ArrayTennis: ArrayList<TimeArr> = savedInstanceState?.getParcelableArrayList("time1", TimeArr::class.java) ?: arrayListOf()
两种方案都能解决你的问题,其中Parcelable方案性能更优,且代码简洁,更符合Android开发的最佳实践。
内容的提问来源于stack exchange,提问作者Satyam Raikwar
相关产品推荐
相关产品推荐

