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
相关产品推荐
相关产品推荐

