在我的应用程序中有一个类,我已经声明了一些static
个变量。问题是当应用程序被销毁时,所有变量的值都没有重置
当应用程序被销毁时,有没有办法重置所有静态变量的值,除了在onDestroy()
中单独重置它们?
答案 0 :(得分:13)
class MySettings {
// final can't be changed
public static final String CONSTANT = "ucantchangeme";
// static - all Objects have just these - even different Acitivities etc
public static String sUserName;
// class instance members - each Object you create with new has its own version
public String mUserName;
public MySettings() {
mUserName = "uninitialized";
}
public static void init() {
sUserName = "Peter";
}
public static void reset() {
sUserName = null;
}
}
/* Your Activity */
class MyActivity extends Actitivy {
private MySettings mSettings;
private MySettings mOtherSettings;
onCreate() {
// init those static parts of MySettings
MySettings.init();
mSettings = new mSettings();
mSettings.mUserName = "Peter"
Log.d("TAG", "Username: " + mSettings.mUserName);
// prints Peter
// this could also be another Activity
mOtherSettings = new MySettings();
Log.d("TAG", "Username: " + mOtherSettings.mUserName);
// prints "uninitialized"
MySettings.sUserName = "Jim";
Log.d("TAG", "Username: " + MySettings.sUserName);
// prints "Jim"
mSettings.sUserName = "Joe";
Log.d("TAG", "Username: " + MySettings.sUserName);
Log.d("TAG", "Username: " + mSettings.sUserName);
Log.d("TAG", "Username: " + mOtherSettings.sUserName);
// all print "Joe" now
}
onDestroy() {
// clear MySettings
MySettings.reset();
}
}
你可以将静态变量重置为null
或你想要的任何值,但是对于其他东西使用静态变量然后常量通常是一个坏主意 - 它通常是糟糕的类设计并且可能导致意外的行为,就像你观察到的那样
只要加载了类,静态变量的值就会持续存在 - 它几乎与Activity生命周期无关(onCreate
,...,onDestroy
)
第一次从代码访问类时,它将被加载,然后在有理由卸载它之前它不会消失。在此期间,您的应用程序中的任何内容(技术上在同一个进程中 - 通常每个.apk使用它自己的)将从这些静态读取相同的值。如果你从不同的地方改变它,你可以改变其他不知道改变的部分 - 这就是为什么它不好的原因:)
Android会卸载一个类的唯一原因(我知道)是你的应用程序从内存中完全删除 - 通过任务杀手或当你的应用程序不再活动且内存不足时。这完全不受您的控制,在使用您的应用时不应该发生。例如,如果发生一个电话进来,你的应用程序稍后会恢复。
答案 1 :(得分:5)
在onDestroy()
中,您可以将 null 值设置为static variables
..
修改强>
在包含的类时创建并初始化 Static variables
它们由类加载器加载到VM中。当班级是
卸载或VM结束,静态变量变为“poof”。有
一般不需要清除它们。
我想如果你想要你可以在onTerminate()中清除它们
方法(在应用程序中)或onDestroy()
方法(在活动中),
但这样做并没有多大意义,而且无法保证
将调用这两种方法中的任何一种。
如果你出于某种原因对变量不存在偏执
在创建时清除(严重违反VM的“合同”),您
可以用onCreate()
方法清除它们。
答案 2 :(得分:3)
这是不可能的,当您的活动被破坏时,您的静态变量必须清除。 您的静态变量可能在某些其他活动中声明,并且您可能会销毁其他活动。
Activity loses almost all the references once get destroyed.
答案 3 :(得分:0)
当您的活动明星检查您的变量时。一旦活动被破坏,所有变量将再次初始化。检查变量值。 一旦活动破坏你的变量值是相同的,这是不可能的。当你的变量值初始化时检查那个。
在Destroy方法上重新初始化变量。静态变量=“”或静态变量= null。
答案 4 :(得分:0)
如果你重置你的静态变量onCreate它们不再是静态的,你也可以使用非静态变量。
事实上,由于指定的静态变量行为与Android的应用程序生命周期之间缺乏同步性,因此最好这样做。