Очистка статических данных onDestroy () - PullRequest
12 голосов
/ 17 марта 2012

В моем приложении есть класс, в котором я объявил несколько static переменных.Проблема заключается в том, что значения для всех переменных не сбрасываются при разрушении приложения.
Есть ли способ сбросить значения всех статических переменных при разрушении приложения, кроме индивидуального сброса их в onDestroy()?

Ответы [ 5 ]

13 голосов
/ 17 марта 2012
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 будет выгружать класс, состоит в том, что ваше приложение полностью удаляется из памяти - либо через убийцу задач, либо когда ваше приложение перестает быть активным и память становится мало. Это полностью вне вашего контроля и не должно происходить во время использования вашего приложения. Это может произойти, если, например, приходит телефонный звонок, и ваше приложение возобновляется позже.

5 голосов
/ 17 марта 2012

В onDestroy() вы можете установить ноль значения для этих static variables ..

РЕДАКТИРОВАТЬ:

Static variables созданыи инициализируется, когда класс, содержащий их, загружается в виртуальную машину загрузчиком классов.Когда класс выгружен или виртуальная машина завершилась, статические переменные переходят в «пуф».Обычно их не нужно очищать.

Полагаю, если вы захотите, вы можете очистить их с помощью метода onTerminate () (в приложении) или onDestroy() (в действии), но естьв этом нет особого смысла, и нет никакой гарантии, что любой из этих двух методов будет вызван.

Если вы по какой-то причине параноидально относитесь к тому, что переменные не очищаются при создании (серьезное нарушение«контракт» виртуальной машины), вы можете очистить их методом onCreate().

3 голосов
/ 17 марта 2012

Это невозможно, ваша статическая переменная должна быть очищена, когда ваша активность уничтожена. Возможно, ваша статическая переменная объявлена ​​в каком-то другом действии, а вы уничтожаете другое действие.

Activity loses almost all the references once get destroyed.
0 голосов
/ 18 июля 2016

Если вы сбрасываете статические переменные в onCreate, они больше не статичны, и вы также можете использовать нестатическую переменную.

На самом деле вам, скорее всего, лучше этого делать из-за отсутствия синхронности между поведением указанных статических переменных и жизненным циклом приложения Android.

0 голосов
/ 17 марта 2012

Когда ваша звезда активности проверяет вашу переменную. Как только активность уничтожена, все переменные инициализируются снова.Проверьте значение вашей переменной.Это невозможно, если действие уничтожает значение вашей переменной.Проверьте это, когда значение вашей переменной при инициализации.

ИЛИ Переинициализированная переменная в методе DestroyСтатическая переменная = "" или Статическая переменная = ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...