我可以信任我的全局变量在屏幕旋转期间始终被保留吗?(Android /Kotlin)

j9per5c4  于 2023-01-24  发布在  Android
关注(0)|答案(2)|浏览(153)

使用全局变量而不是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来保存旋转期间的状态。
然而,我很清楚全局变量在旋转过程中不会改变。我使用过许多模拟和真实的设备,它们的行为都是一样的。

xtfmy6hx

xtfmy6hx1#

只要全局变量的作用域在内存中,它们就会一直存在,所以这取决于你把它们存储在哪里--如果它们在顶层(例如,在文件的顶层定义,或者在Application组件中定义),那么这种状态就会一直存在,直到进程被销毁。
如果你的状态存储在Activity中,那么Activity将在循环时被销毁,所以通常你会使用传递到onSaveInstanceState中的Bundle来存储你需要的任何数据,然后在适当的时候恢复它。
如果你的应用在后台,它的进程可以随时被系统销毁--在这种情况下,你会丢失你的全局变量state。对于Activity,这些 * 保存state* 生命周期方法会被调用,所以你仍然会存储在Bundle中,并在应用再次打开时接收到Bundle。进程将被销毁。但如果设置为存储和恢复该状态,则处理方式与循环类似。(这与用户实际关闭应用的情况不同,用户会将下次打开应用视为“全新开始”,并且不提供任何存储状态。)
您还可以使用 * 查看模型 * 来存储状态,这些状态在轮换后仍然存在,但需要使用SavedStateHandle来表现得像Bundle并在进程死亡后仍然存在(但同样,不是实际的重新启动)。
这意味着它取决于你存储的内容、需要保存的时间以及应用在后台时是否允许销毁它,最后一个选项通常是“否”,这使得全局变量在大多数情况下都不适合。
你需要一些方法来持久化这些数据(例如SharedPreferences),在这一点上,你也可以使用它作为你的状态,而不是将它存储在那里 * 和 * 在一个变量中。尽管由你决定!持久化数据也是你如何处理状态生存 * 全新启动 * 应用程序重新启动,例如存储一个高分,不应该消失,当用户关闭应用程序。
(Also我不确定向聊天机器人征求建议到底值多少钱,不管它有多“坚持”!但那是另一个主题了)

798qvoo8

798qvoo82#

全局变量会在应用运行期间一直存在,但当应用在后台运行时,您无法保证Android操作系统不会停止并重新启动应用(这会丢失所有全局变量或静态变量)。一旦应用进入后台运行,您就无法确定它们是否会一直存在。
你所发布的内容看起来很好,如果你只通过getAllLevels方法访问它(因为它会在需要的时候重新创建它)。但是,如果你在其他地方添加级别,这些内容可能会丢失。
如果您希望能够添加级别,一个可能的解决方案是在列表为空时将数据从SharedPreferences加载到getAllLevels中-并在添加级别时更新SharedPreferences

相关问题