使用全局变量而不是bundle来保持屏幕旋转之间的状态是不是一个糟糕的做法?
我真的很喜欢使用全局变量来保持状态,但是既然所有的东西都建议使用bundle,我应该这样做吗?我不知道我会想到什么陷阱。
这里有一段代码演示了全局变量不会改变。我必须在添加之前检查LEVEL_DEFS列表是否为0,否则每次屏幕旋转都会添加重复的级别(我最初认为我必须在旋转后重新添加级别)。
val LEVEL_FILES = arrayOf("levels/lv1.txt", "levels/lv2.txt", "levels/lv3.txt")
val LEVEL_DEFS = mutableListOf<LevelDefinition>()
fun getAllLevels(context: Context): MutableList<Level> {
if (LEVEL_DEFS.size == 0) {
for (filename in LEVEL_FILES) {
LEVEL_DEFS.add(LevelDefinition(getTextFileString(context, filename)))
}
}
}
'
当我谷歌屏幕旋转时,所有的结果都建议你必须使用一个捆绑包来保存状态。
我还询问了chat gpt-3,它坚持我必须使用bundle来保存旋转期间的状态。
然而,我很清楚全局变量在旋转过程中不会改变。我使用过许多模拟和真实的设备,它们的行为都是一样的。
2条答案
按热度按时间xtfmy6hx1#
只要全局变量的作用域在内存中,它们就会一直存在,所以这取决于你把它们存储在哪里--如果它们在顶层(例如,在文件的顶层定义,或者在
Application
组件中定义),那么这种状态就会一直存在,直到进程被销毁。如果你的状态存储在
Activity
中,那么Activity
将在循环时被销毁,所以通常你会使用传递到onSaveInstanceState
中的Bundle
来存储你需要的任何数据,然后在适当的时候恢复它。如果你的应用在后台,它的进程可以随时被系统销毁--在这种情况下,你会丢失你的全局变量state。对于
Activity
,这些 * 保存state* 生命周期方法会被调用,所以你仍然会存储在Bundle
中,并在应用再次打开时接收到Bundle
。进程将被销毁。但如果设置为存储和恢复该状态,则处理方式与循环类似。(这与用户实际关闭应用的情况不同,用户会将下次打开应用视为“全新开始”,并且不提供任何存储状态。)您还可以使用 * 查看模型 * 来存储状态,这些状态在轮换后仍然存在,但需要使用
SavedStateHandle
来表现得像Bundle
并在进程死亡后仍然存在(但同样,不是实际的重新启动)。这意味着它取决于你存储的内容、需要保存的时间以及应用在后台时是否允许销毁它,最后一个选项通常是“否”,这使得全局变量在大多数情况下都不适合。
你需要一些方法来持久化这些数据(例如
SharedPreferences
),在这一点上,你也可以使用它作为你的状态,而不是将它存储在那里 * 和 * 在一个变量中。尽管由你决定!持久化数据也是你如何处理状态生存 * 全新启动 * 应用程序重新启动,例如存储一个高分,不应该消失,当用户关闭应用程序。(Also我不确定向聊天机器人征求建议到底值多少钱,不管它有多“坚持”!但那是另一个主题了)
798qvoo82#
全局变量会在应用运行期间一直存在,但当应用在后台运行时,您无法保证Android操作系统不会停止并重新启动应用(这会丢失所有全局变量或静态变量)。一旦应用进入后台运行,您就无法确定它们是否会一直存在。
你所发布的内容看起来很好,如果你只通过
getAllLevels
方法访问它(因为它会在需要的时候重新创建它)。但是,如果你在其他地方添加级别,这些内容可能会丢失。如果您希望能够添加级别,一个可能的解决方案是在列表为空时将数据从
SharedPreferences
加载到getAllLevels
中-并在添加级别时更新SharedPreferences
。