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

onSaveInstanceState状态存储异常:所有键值被最后putString值覆盖

问题:onSaveInstanceState中Bundle键值被意外覆盖

问题现象

在开发Activity时使用onSaveInstanceState存储状态,出现所有键对应的值都被最后一次putString操作的值覆盖的异常情况:

  • 无论调换putString的调用顺序,最后存入的字符串会成为所有键对应的取值
  • 日志显示两次存入和取出的都是同一个值

相关代码

常量定义

companion object {
    const val EXTRA_INDEX = "extra_index"
    private const val STATE_COMMENT_NAME = ""
    private const val STATE_COMMENT_COMMENT = ""
}

第一次onSaveInstanceState实现

outState.putString(STATE_COMMENT_NAME, tvCommentName.text.toString())
outState.putString(STATE_COMMENT_COMMENT, tvCommentComment.text.toString())

此时STATE_COMMENT_NAME被填充为tvCommentComment.text.toString().trim()的值。

调换顺序后的onSaveInstanceState实现

outState.putString(STATE_COMMENT_COMMENT, tvCommentName.text.toString().trim())
outState.putString(STATE_COMMENT_NAME, tvCommentComment.text.toString().trim())

此时STATE_COMMENT_COMMENT被填充为tvCommentName.text.toString().trim()的值。

排查日志

2022-08-09 08:14:57.384 27561-27561/com.dicoding.kelassekolah D/GalleryDetail Bundle: onSaveInstanceState Nice photos!
2022-08-09 08:14:57.384 27561-27561/com.dicoding.kelassekolah D/GalleryDetail Bundle: onSaveInstanceState Nice photos!
2022-08-09 08:14:57.519 27561-27561/com.dicoding.kelassekolah D/GalleryDetail Bundle: savedInstanceState Nice photos!
2022-08-09 08:14:57.519 27561-27561/com.dicoding.kelassekolah D/GalleryDetail Bundle: savedInstanceState Nice photos!

问题根源

STATE_COMMENT_NAME和STATE_COMMENT_COMMENT两个常量都被赋值为空字符串"",相当于用同一个键名往Bundle中存储数据。Bundle的存储逻辑是同键名的后续存入值会覆盖之前的值,所以两次putString实际上是往同一个键里存了两次值,最终所有“键”(实际为同一个空键)对应的都是最后一次存入的值。

解决方案

修改常量定义,给两个键设置不同的非空标识字符串:

companion object {
    const val EXTRA_INDEX = "extra_index"
    private const val STATE_COMMENT_NAME = "state_comment_name"
    private const val STATE_COMMENT_COMMENT = "state_comment_comment"
}

这样两个键名唯一,存入Bundle时不会互相覆盖,后续从savedInstanceState中取值时也能正确获取各自对应的数据。

内容的提问来源于stack exchange,提问作者amirudev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:27:34