Поведение статической переменной Android при сбое приложения

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

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

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


person png    schedule 02.04.2012    source источник


Ответы (4)


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

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

person Snicolas    schedule 02.04.2012
comment
я исправил сбой, но хотел знать поведение. Спасибо . - person png; 02.04.2012
comment
Это был хороший вопрос, хотя он не упоминался в документации по Android. - person Snicolas; 02.04.2012
comment
Примите ответ, если он подходит. - person Snicolas; 02.04.2012
comment
Если приложение перезапускается, как оно получает предыдущий стек активности. Мое приложение всякий раз, когда перезагружается в LoginActivity, я читаю имя пользователя из sharedpref. Здесь я вижу, что активность входа в систему не перезапускается, запускается установленная активность A, которая находится на вершине стека. И в A я устанавливаю переменную как Loginactivity.username, и эта переменная сбрасывается, хотя активность не перезапускается! – - person png; 02.04.2012
comment
Таким образом, чтение общих настроек происходит не в нужном месте. Вы должны рассмотреть возможность чтения в каждом действии, которое нуждается в ценности. Но устранили ли вы причину сбоя? - person Snicolas; 02.04.2012
comment
Это хороший ответ. Но... Конечно, мы хотим исправить все вылеты. Но в моем случае я хотел отправить WS некоторые данные о сбое. Сделал сервис с логикой http запроса. Но при сбое переменные, которые я инициировал в службе, были нулевыми. Все еще ищу способ их сохранить. - person Moshe Yamini; 11.11.2020

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

person jjNford    schedule 02.04.2012
comment
У меня есть сомнения: если приложение перезапускается, как оно получает предыдущий стек активности. Мое приложение всякий раз, когда перезагружается в LoginActivity, я читаю имя пользователя из sharedpref. Я вижу, что активность входа в систему не перезагружается, запускается установленная активность A, которая находится на вершине стека. И в A я устанавливаю переменную как Loginactivity.username, и эта переменная сбрасывается, хотя активность не перезапускается! - person png; 02.04.2012
comment
Возможно, ваши общие настройки работают неправильно. Ваш стек был убит виртуальной машиной. Или ваша логика обхода активности входа имеет сбой. Источник? - person jjNford; 02.04.2012

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

person Dmitry Zaytsev    schedule 02.04.2012

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

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

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

person MarkySmarky    schedule 02.04.2012