清除静态数据onDestroy()

时间:2012-03-17 10:07:22

标签: android static android-activity

在我的应用程序中有一个类,我已经声明了一些static个变量。问题是当应用程序被销毁时,所有变量的值都没有重置 当应用程序被销毁时,有没有办法重置所有静态变量的值,除了在onDestroy()中单独重置它们?

5 个答案:

答案 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的应用程序生命周期之间缺乏同步性,因此最好这样做。