【发布时间】:2012-04-02 16:38:26
【问题描述】:
在我的应用程序中有一个类,我在其中声明了一些 static 变量。问题是应用程序被销毁时所有变量的值都没有重置。
有没有办法在应用程序被销毁时重置所有静态变量的值,除了在onDestroy()中单独重置它们?
【问题讨论】:
标签: android static android-activity
在我的应用程序中有一个类,我在其中声明了一些 static 变量。问题是应用程序被销毁时所有变量的值都没有重置。
有没有办法在应用程序被销毁时重置所有静态变量的值,除了在onDestroy()中单独重置它们?
【问题讨论】:
标签: android static android-activity
这是不可能的,当你的活动被破坏时,你的静态变量必须是明确的。 您的静态变量可能在其他活动中声明,而您破坏了其他活动。
Activity loses almost all the references once get destroyed.
【讨论】:
在onDestroy() 中,您可以将null 值设置为static variables..
编辑:
Static variables 在包含的类时创建并初始化
它们由类加载器加载到 VM 中。上课时
卸载或虚拟机结束,静态变量会“噗”的一声。有
一般不需要清除它们。
我想如果你愿意,你可以在 onTerminate() 中清除它们
方法(在应用程序中)或onDestroy() 方法(在活动中),
但这样做没有多大意义,也不能保证
这两种方法中的任何一种都会被调用。
如果您出于某种原因偏执于变量不存在
创建时清除(严重违反虚拟机的“合同”),您
可以用onCreate() 方法清除它们。
【讨论】:
当您的活动之星检查您的变量时。一旦活动被破坏,所有变量都会再次初始化。检查您的变量值。 一旦活动被破坏,您的变量值就不可能相同。检查那个当你的变量值初始化的时候。
或在 Destroy 方法上重新初始化变量。静态变量="" 或静态变量=null。
【讨论】:
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 将卸载类的唯一原因(我知道)是您的应用程序完全从内存中删除 - 无论是通过任务杀手,还是当您的应用程序不再处于活动状态且内存不足时。这完全超出了您的控制范围,并且在使用您的应用程序时不应发生。它可能会发生,例如有电话打进来,您的应用稍后会恢复。
【讨论】:
reset() 中那样手动执行时才有效。如果你有很多,你可以用reflection 在所有字段的循环中做到这一点,但我不会这样做。
如果您在创建时重置静态变量,它们不再是静态的,您也可以使用非静态变量。
事实上,由于指定的静态变量行为与 Android 的应用生命周期之间缺乏同步性,因此这样做很可能会更好。
【讨论】: