You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

屏幕旋转时存储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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:22:09