noo*_*oob 12 static android android-activity
在我的应用程序中有一个类,我已经声明了一些static变量.问题是当销毁应用程序时,所有变量的值都没有重置.
当应用程序被销毁时,有没有办法重置所有静态变量的值,除了单独重置它们onDestroy()?
zap*_*apl 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();
}
}
Run Code Online (Sandbox Code Playgroud)
你可以将静态变量重置为null你想要的任何值,但是对于其他东西使用静态变量然后常量通常是个坏主意 - 它通常是糟糕的类设计并且可能导致意外的行为,就像你观察到的那样.
只要类加载的静态变量的值将继续存在-它几乎无关的活动周期(onCreate,... onDestroy)
第一次从代码访问类时,它将被加载,然后在有理由卸载它之前它不会消失.在此期间,您的应用程序中的任何内容(技术上在同一个进程中 - 通常每个.apk使用它自己的)将从这些静态读取相同的值.如果你从不同的地方改变它,你可以改变其他不知道改变的部分 - 这就是为什么它不好:)
Android(我知道)Android将卸载一个类的唯一原因是你的应用程序被完全从内存中移除 - 通过任务杀手或你的应用程序不再活动而内存变低.这完全不受您的控制,在使用您的应用时不应该发生.例如,如果打来电话并且您的应用程序稍后恢复,则可能会发生这种情况.
在onDestroy()你可以设置空值到那些static variables..
编辑:
Static variables当包含它们的类被类加载器加载到VM中时,会创建并初始化它们.当卸载类或VM结束时,静态变量变为"poof".通常没有必要清除它们.
我想如果你想要你可以在onTerminate()方法(在应用程序中)或onDestroy()方法(在一个活动中)中清除它们,但这样做并没有多大意义,并且无法保证这两者中的任何一个方法将被调用.
如果你出于某种原因对创建时未被清除的变量(严重违反VM的"合同")的偏执感到偏执,你可以用一种onCreate()方法清除它们.
| 归档时间: |
|
| 查看次数: |
18417 次 |
| 最近记录: |