Время жизни статических (классовых) переменных - PullRequest
4 голосов
/ 28 мая 2011

В течение довольно долгого времени я был блаженно убежден, что статические переменные [экземпляра] существуют, пока приложение работает. однако, к моему ужасу и большой тревоге, я чувствую, что это неправда.

для простого тестирования я создал статический список строк, и в моем основном классе activity переопределил метод onDestroy, чтобы напечатать сообщение, чтобы убедиться, что приложение закрыто. в методе onCreate я просто добавил новый string и распечатал содержимое списка. я обнаружил, что размер списка продолжает увеличиваться, и все ранее добавленные строковые значения все еще присутствуют.

Я читал местами [даже здесь, в SO], что переменные экземпляра существуют столько, сколько существует приложение, но я боюсь, что это не совсем так.

Если быть более точным, я осознал эту проблему при использовании Facebook SDK для Android. Я видел, что экземпляры AuthListener в списке слушателей в классе SessionEvents только продолжают увеличиваться с течением времени. Следовательно, всякий раз, когда приложение запускается и пользователь входит в систему с использованием FB, методы прослушивателя запускаются столько раз, сколько есть экземпляров, присутствующих в классе SessionEvents.

Кто-то наблюдал это раньше, и есть ли какая-то кардинальная ошибка, которую я совершаю в понимании того, как работает Android?

что дает?

спасибо за чтение!

* * Тысяча двадцать-один [ UPDATE ]
Я стою исправлено BalusC и rdineiu. Я действительно не хотел создавать путаницу в отношении переменных экземпляра и класса. Увы, в спешке опубликовать вопрос я допустил ошибку, которую не хотел. Я очень хорошо знаю разницу между static и instance переменными. Я просто намеревался написать class переменных, и не могу понять, что произошло, чтобы ссылаться на статические переменные как instance переменные.

Однако мой вопрос остается в силе. @ MisterSquonk - нет, я не путаю здесь, когда заканчивается мой Activity и когда приложение уничтожается. Вот что я попробовал на примере - у меня есть только ОДИН Activity, который служит Main. Когда я нажимаю кнопку возврата из этого Activity, я предполагаю, что Activity удаляется из стека и , приложение также уничтожается. Я запустил диспетчер задач, чтобы убедиться, что мое приложение больше не работает.

Ответы [ 3 ]

6 голосов
/ 15 июня 2011

итак - я опубликовал тот же вопрос [к сожалению, допустив ту же ошибку, когда назвал static переменные в качестве instance переменных] в группе разработчиков Google Android.

Я получил несколько действительно хороших ответов, особенно от Костя . Мои взаимодействия с этой группой помогли мне понять основные «правила» платформы Android.

Надеюсь, что ветка сообщений также поможет вам.

6 голосов
/ 28 мая 2011

Вы, похоже, не проводите различий между статическими и переменными экземпляра.Статические переменные определены в самом классе.Переменные экземпляра присутствуют только в экземплярах класса.

Пример:

class Test {
    public static int a;
}

Переменная a определена в самом классе , а не в экземплярах класса,Каждый экземпляр получит доступ к той же самой переменной .Если один экземпляр устанавливает значение a равным 5, каждый другой экземпляр будет видеть значение как 5.Переменная не исчезнет после исчезновения экземпляра, поскольку она никоим образом не связана с каким-либо экземпляром (это переменная класса ).Он будет оставаться там до конца времени (или до тех пор, пока приложение не закроется, в зависимости от того, что наступит раньше).

С другой стороны, в следующем примере используется переменная экземпляра:

class Test {
    public int a;
}

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


Для иллюстрации:

import java.util.List;
import java.util.ArrayList;

class Test {
  // instanceVar will be initialized whenever a new Test object is created
  private List<Integer> instanceVar = new ArrayList<Integer>();

  // staticVar will be initialized right now
  private static List<Integer> staticVar = new ArrayList<Integer>();

  public void updateInstanceVar() {
    instanceVar.add(1);
    instanceVar.add(2);
  }

  public void updateStaticVar() {
    staticVar.add(1);
    staticVar.add(2);
  }

  public static void main(String[] args) {
    Test test1 = new Test();
    test1.updateInstanceVar(); // test1.instanceVar = [1, 2]
    test1.updateStaticVar();   // Test.staticVar    = [1, 2]

    Test test2 = new Test();
    test2.updateInstanceVar(); // test2.instanceVar = [1, 2]
    test2.updateStaticVar();   // Test.staticVar    = [1, 2, 1, 2]
  }
}
0 голосов
/ 28 мая 2011

Переменные экземпляра уничтожаются, когда приложение это делает, но некоторые графические виджеты по умолчанию сохраняют свое состояние и затем восстанавливают его в методе onCreate.

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