поведение статической переменной Android при сбое приложения - PullRequest
7 голосов
/ 02 апреля 2012

В моем приложении есть логинактивность. Он имеет статическую переменную username и ему будет присвоено значение ввода username. Активность запуска Loginactivity A и A B. В A я использую переменную Loginactivity.username.

Теперь из-за ошибки в B происходит сбой приложения. Когда я нажимаю принудительно, приложение перезапускается, и действие A является текущим действием. В упражнении A я использую статическую переменную Loginactivity.username. Я вижу, что после сбоя эта переменная получает свое начальное значение, которое является пустой строкой "";

Почему так происходит? Можете ли вы объяснить это поведение? Итак, когда происходит сбой приложения, все действия в стеке перезапускаются? Я вижу, что создание логина не вызывается. Тогда как меняется значение статической переменной?

Ответы [ 4 ]

12 голосов
/ 02 апреля 2012

Да, когда происходит сбой приложения, jvm для этого приложения перезапускается, ваши классы перезагружаются, и вы теряете все статические переменные, а также переменные экземпляра.

Решение состоит в том, чтобы устранить причину сбоя.:)

3 голосов
/ 02 апреля 2012

Когда в вашей Деятельности B происходит сбой виртуальной машины Android Dalvik, на которой запущено ваше приложение (каждое приложение имеет свой собственный DVM, представляющий собой отдельные процессы), оно уничтожается.Когда вы запускаете Activity A, имя пользователя "", потому что Java по умолчанию устанавливает все переменные экземпляра (переменные класса или поля, если вам нравится) в null (ссылки), 0 (примитивы) и "" для строк.Таким образом, ваша активность А работает правильно.Вам просто нужно либо сохранить имя пользователя в общих настройках, базе данных, либо вызвать событие для повторного входа пользователя ... Я бы также исправил действие B ... Ха-ха

2 голосов
/ 02 апреля 2012

Используйте взамен SharedPreferences или сохраните информацию в классе приложения

1 голос
/ 02 апреля 2012

Это потому, что у вас есть утечка памяти, вызванная этим статическим членом, который вы храните в LoginActivity.

Я бы рассмотрел сохранение этой переменной в области приложения (пользовательский класс приложения) или сохранение ее в БД.

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

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