在我的应用程序存在这样的情况我已经声明了一些static
变量的类。问题是所有变量的值在应用程序被销毁时不会重置。
有什么办法来重置当应用程序被破坏了所有的静态变量的值,除了在onDestroy()
单独重置呢?清除静态数据的onDestroy()
回答
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
或任何你想要的值,但使用静态变量,其他东西则常数通常是一个坏主意 - 这通常是不好的一流的设计,并可能导致像你所观察到的异常行为。
只要类加载的静态变量的值将继续存在 - 它几乎无关的活动周期(onCreate
,...,onDestroy
)
第一次访问从代码的类它会被加载,然后它不会消失,直到有理由卸载它。在此期间,您的应用程序中的任何内容(技术上在同一过程中 - 通常每个.apk都使用它自己的内容)将从这些静态内容读取相同的值。如果你从不同的地方改变它,你改变它不知道变化的其他部分 - 这就是为什么它的坏:)
的唯一原因(我知道)是Android将卸载一类是你的应用程序会从内存中完全删除 - 无论是通过任务杀手,还是当您的应用程序不再处于活动状态并且内存不足时。这完全超出了你的控制范围,在使用你的应用程序时不应该发生。这可能会发生,如果一个电话进来,你的应用程序稍后恢复。
那是不可能的,当你的活动破坏了你的静态变量必须明确。 您的静态变量可能会在其他某个活动中声明并且您销毁其他活动。
Activity loses almost all the references once get destroyed.
变量是在一个单独的类中声明的,它不是一个活动。当第一个活动启动时它们被初始化。但是当我完成应用程序并检查这些值时,它们保留了它的价值。 – noob 2012-03-17 10:14:08
所以你必须手动清除它。在activity的onDestroy()中staticvariable =“”/ null; – 2012-03-17 10:15:59
在onDestroy()
可以设置空值那些static variables
..
编辑:
Static variables
被创建和初始化时含有 类他们被加载到虚拟机类加载器。当类是 卸载或虚拟机结束时,静态变量变“poof”。有 一般不需要清除它们。
我想,如果你想,你可以在onTerminate() 方法(应用程序)或onDestroy()
方法(在一个活动)清除它们, 但没有太多的点这样做,而且也不保证将会调用这两种方法中的任何一种。
如果你因为某些原因偏执不是 创建(虚拟机的“合同”的严重违反)时清零变量,你可以 在onCreate()
方法清除它们。
当你的活动星检查variable.Once活动是摧毁所有变量再次初始化。检查你的变量值。 一旦活动破坏你的变量值是不可能的。检查当你的变量值初始化时。
OR上Destroy方法重新初始化变量。静态变量=“”或静态变量=空。
每个实例都不会初始化静态变量。他们绑定到类而不是实例。 – Praveen 2012-04-06 04:50:18
如果你重置你的静态变量onCreate,它们不再是静态的,你也可以使用非静态变量。
实际上,由于指定的静态变量行为与Android应用生命周期之间缺乏同步性,您最好这样做。
- 1. 清除“缓存”的onDestroy
- 2. Zend Cache后端静态删除/清除
- 3. 清除静态,现在收集静态将不起作用
- 4. 静态和非静态数据以JavaScript
- 5. 清除列数据
- 6. 清除数据表
- 7. 清除ZedGraph数据
- 8. Recyclerview数据清除
- 9. 动态清除eventSources数组
- 10. UIPickerView,静态数据
- 11. 与静态数据
- 12. 的foreach与静态数据
- 13. 清漆+静态HTML页面
- 14. 清理onDestroy和onDetach中的片段
- 15. 如何清除Android中的静态变量
- 16. 关于c#中“静态”字段的清除
- 17. 避免机器人清除我的静态字段
- 18. C++静态对象中的类的静态数据成员和静态方法?
- 19. 访问Haxe静态字段的静态初始化的非静态数据
- 20. 澄清静态VS动态片段
- 21. 根据静态文件中的数据从动态文件中删除文本
- 22. JavaFX AreaChart清除数据
- 23. GAE清除数据库
- 24. 清除OrientDB数据库
- 25. Cassandra每日数据清除?
- 26. 清除Postgresql数据库
- 27. RavenDB清除数据库
- 28. jQuery Draggable清除元数据
- 29. “清除用户数据”android
- 30. 类的静态方法访问的静态数据成员
与我现在正在做的完全一样,但是有很多静态变量需要重置,所以我在考虑是否有更好或更干净的方法来完成此操作。 – noob 2012-03-17 11:17:14
只有像'reset()'那样手动执行它才有效。如果你有很多他们,你可以在所有领域的循环中使用[反射](http://java.sun.com/developer/technicalArticles/ALT/Reflection/)来完成,但我不会那样做。 – zapl 2012-03-17 11:42:38