статическая переменная сбрасывается по неизвестной причине - PullRequest
0 голосов
/ 08 июля 2011

У меня есть класс с именем «DataReference», в котором есть ряд статических переменных, к которым обращаются различные классы во время выполнения программы.

У меня есть одна переменная public public int частицыPercent = 100;который может быть изменен только из действия «SettingView» действия главного меню.

Однако, при выходе из действия «GameView» действия основного меню, переменная elementPercent всегда сбрасывается в 100, даже если значение можетбыло отредактировано из «SettingView».

Я ожидаю, что переменная останется такой же, как она статическая и не редактируется нигде, кроме действия «SettingView».

Пожалуйста, дайте мне знать, если у вас естьЛюбая идея, что может происходить, или если мне нужно предоставить дополнительные разъяснения по ситуации.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 31 марта 2014

Как вы видите на диаграмме в документации Android , любой процесс, приложение которого приостановлено, остановлено или уничтожено, может быть убит: diagram

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

Чтобы решить эту проблему, такие переменные необходимо каким-то образом сохранить, например в onSaveInstanceState метод действия.

2 голосов
/ 08 июля 2011

Я сталкивался с этой проблемой довольно много раз, хотя я не уверен, что причина была той же.Android сбрасывает переменные, когда у него мало памяти.Эта ветка может помочь вам больше - Android: статическая переменная null при малой памяти

0 голосов
/ 09 июля 2011

Статические переменные принадлежат классу, а не экземпляру класса.

Где изначально установлено значение?

У вас есть несколько вариантов, чтобы увидеть, как он сбрасывается. Если вы хотите посмотреть, что его переустанавливает или когда-либо его настраивают.

  1. Сделайте переменную статической, но закрытой, и напишите открытые статические методы получения и установки. Затем установите точки останова в сеттере и просто отладьте. Когда он установлен (если он установлен!), Вы можете посмотреть на стек, чтобы понять, почему он установлен и на что.
  2. Если это не ваша чашка чая, вы всегда можете выбросить исключение и сразу же поймать его и распечатать трассировку стека. Это сделает то же самое для вас - покажет вам стек вызовов, чтобы вы могли увидеть, какой код его переустанавливает.
0 голосов
/ 08 июля 2011

Это устанавливается в отдельном потоке?Если несколько потоков обращаются к этому значению, и оно изменяется в другом потоке, нет гарантии, что другие потоки когда-либо увидят изменения без синхронизированного доступа.

...