Navigation组件传Serializable参数时App切后台/点最近任务崩溃如何解决
问题根因
该序列化异常由两个核心原因触发:
LocationItem虽然实现了Serializable接口,但它内部持有的List<Place>对应的Place类没有实现Serializable接口,序列化完整对象链时会抛出IO异常- 应用切后台、点击最近任务按钮时,系统会自动将当前页面状态(包括导航参数)存入
Bundle做持久化,此时会触发参数的序列化流程,因此只有这类操作时才会报错
解决方案
方案1:快速修复(基于现有Serializable实现)
给Place类也添加Serializable接口实现即可:
data class Place( val name: String, val lat: Double, val long: Double ) : Serializable
方案2:安卓平台推荐方案(改用Parcelable)
安卓平台更推荐使用Parcelable替代Serializable作为跨页面传递对象的实现,性能是Serializable的10倍以上,也更适配系统状态保存场景:
- 先在模块级
build.gradle.kts中开启kotlin-parcelize插件:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-parcelize") // 新增该行 }
- 将
LocationItem和Place都改为实现Parcelable:
import kotlinx.parcelize.Parcelize import android.os.Parcelable @Parcelize data class Place( val name: String, val lat: Double, val long: Double ) : Parcelable @Parcelize data class LocationItem( val name: String, val locations: List<Place> ) : Parcelable
- 现有导航参数使用代码无需做任何修改,即可正常运行。
注意事项
- 不建议长期使用Serializable作为安卓导航参数,它序列化过程会产生大量临时对象,容易触发GC,性能远低于Parcelable
- 嵌套的自定义类型如果要做序列化/Parcelable,必须保证整个对象链里的所有自定义类型都实现了对应接口,否则会出现运行时异常
内容的提问来源于stack exchange,提问作者Dragos Ciupe
相关产品推荐
相关产品推荐

