gpt4 book ai didi

java - Activity 类中的静态字段是否保证比创建/销毁周期更长?

转载 作者:IT老高 更新时间:2023-10-28 23:34:09 25 4
gpt4 key购买 nike

我经常遇到一个问题,即我必须在 Activity 的多次调用之间保留状态(即,经历几个 onCreate()/onDelete() 循环)。不幸的是,Android 对此的支持真的很差。

作为一种保存状态的简单方法,我认为由于类加载器只加载一次类,因此在静态 Bundle 字段中存储在 Activity 的多个实例之间共享的临时数据是安全的。

但是,偶尔,当实例 A 创建静态包并在其中存储数据,然后被销毁,实例 B 尝试从中读取时,静态字段突然为 NULL。

这是否意味着在 Activity 经历创建/销毁周期时,类已被类加载器删除并重新加载? static 字段在之前引用对象时怎么会突然变为 NULL?

最佳答案

这个答案的第一部分真的很老 - 请参阅下面的正确方法

您可以使用 Application 对象来存储应用程序持久对象。 This Android FAQ也谈到了这个问题。

类似这样的:

public class MyApplication extends Application{
private String thing = null;

public String getThing(){
return thing;
}

public void setThing( String thing ){
this.thing = thing;
}
}

public class MyActivity extends Activity {
private MyApplication app;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

app = ((MyApplication)getApplication());

String thing = app.getThing();
}
}

正确的方式:

第一次编写此答案时,Activity 生命周期的文档不如现在好。阅读 Saving Activity State Activity 文档中的部分帮助我们了解 Android 希望我们如何保存状态。本质上,您的 Activity 在两种情况下开始:(1)作为新 Activity 和(2)由于配置更改或由于内存压力而被销毁后重新创建。当您的 Activity 因为是新 Activity 而开始时,saveInstanceState 为空。否则它不为空。如果它为空,那么您的 Activity 应该从头开始初始化。 fragment 与 Activity 非常相似,我在我的 AnDevCon-14 slide deck 中详细介绍了这个概念。 .你也可以看看sample code有关更多详细信息,请参阅我的 AnDevCon-14 演示文稿。

修改我之前的示例将类似于下面的代码。我确实稍微改变了语义——在第二个版本中,我假设字符串 thing 特定于特定 android task 中的 Activity 。 ,在前面的例子中它是模棱两可的。如果您确实想为多个 android 任务保留相同的数据,那么使用 Application 对象或另一个单例仍然是您的最佳选择。

public class MyActivity extends Activity {
private static final String THING = "THING";

private String thing;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (savedInstanceState==null) {
// First time here (since we last backed out at least)
thing = initializeThing(); // somehow we init it
} else {
// Rehydrate this new instance of the Activity
thing = savedInstanceState.getString(THING);
}

String thing = app.getThing();
}

protected void onSaveInstanceState(Bundle outState) {
outState.putString(THING, thing);
}
}

关于java - Activity 类中的静态字段是否保证比创建/销毁周期更长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1636500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com