2012-03-17 70 views
8

在我的应用程序存在这样的情况我已经声明了一些static变量的类。问题是所有变量的值在应用程序被销毁时不会重置。
有什么办法来重置当应用程序被破坏了所有的静态变量的值,除了在onDestroy()单独重置呢?清除静态数据的onDestroy()

回答

10
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将卸载一类是你的应用程序会从内存中完全删除 - 无论是通过任务杀手,还是当您的应用程序不再处于活动状态并且内存不足时。这完全超出了你的控制范围,在使用你的应用程序时不应该发生。这可能会发生,如果一个电话进来,你的应用程序稍后恢复。

+0

与我现在正在做的完全一样,但是有很多静态变量需要重置,所以我在考虑是否有更好或更干净的方法来完成此操作。 – noob 2012-03-17 11:17:14

+0

只有像'reset()'那样手动执行它才有效。如果你有很多他们,你可以在所有领域的循环中使用[反射](http://java.sun.com/developer/technicalArticles/ALT/Reflection/)来完成,但我不会那样做。 – zapl 2012-03-17 11:42:38

1

那是不可能的,当你的活动破坏了你的静态变量必须明确。 您的静态变量可能会在其他某个活动中声明并且您销毁其他活动。

Activity loses almost all the references once get destroyed. 
+0

变量是在一个单独的类中声明的,它不是一个活动。当第一个活动启动时它们被初始化。但是当我完成应用程序并检查这些值时,它们保留了它的价值。 – noob 2012-03-17 10:14:08

+0

所以你必须手动清除它。在activity的onDestroy()中staticvariable =“”/ null; – 2012-03-17 10:15:59

4

onDestroy()可以设置值那些static variables ..

编辑:

Static variables被创建和初始化时含有 类他们被加载到虚拟机类加载器。当类是 卸载或虚拟机结束时,静态变量变“poof”。有 一般不需要清除它们。

我想,如果你想,你可以在onTerminate() 方法(应用程序)或onDestroy()方法(在一个活动)清除它们, 但没有太多的点这样做,而且也不保证将会调用这两种方法中的任何一种。

如果你因为某些原因偏执不是 创建(虚拟机的“合同”的严重违反)时清零变量,你可以 在onCreate()方法清除它们。

0

当你的活动星检查variable.Once活动是摧毁所有变量再次初始化。检查你的变量值。 一旦活动破坏你的变量值是不可能的。检查当你的变量值初始化时。

OR上Destroy方法重新初始化变量。静态变量=“”或静态变量=空。

+0

每个实例都不会初始化静态变量。他们绑定到类而不是实例。 – Praveen 2012-04-06 04:50:18

0

如果你重置你的静态变量onCreate,它们不再是静态的,你也可以使用非静态变量。

实际上,由于指定的静态变量行为与Android应用生命周期之间缺乏同步性,您最好这样做。