powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Android [игнор отключен] [закрыт для гостей] / Статическая переменная в классе Application
9 сообщений из 9, страница 1 из 1
Статическая переменная в классе Application
    #40062846
Slon747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объявляю статическую переменную в классе Application, чтобы потом обращаться к ней с любой активити.
Код: java
1.
2.
3.
public class MyApplication extends Application {
 
    static boolean MyVariant = true;



Потом в какой-то момент выставляю значение MyVariant = false и больше не перезаписываю ее.
Но заметил, что на многих устройствах в процессе работы приложения переменная регулярно сбрасывается в true.
Значит ли это, что класс Application может пересоздаваться в процессе работы приложения? Сам проверить не могу, у меня данная переменная не сбрасывается в true. Может ли это быть связано с многопоточностью или версией андроида?
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40062875
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slon747
Значит ли это, что класс Application может пересоздаваться в процессе работы приложения?
в процессе работы не может. а вот если приложение сворачивается в фон - может.

Slon747
Может ли это быть связано с многопоточностью

может

Slon747
версией андроида?

нет
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40062986
Slon747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, как можно предотвратить перезапись переменной на значение по-умолчанию? Т.е. чтобы не пересоздавалась переменная?
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063041
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slon747
Скажите, как можно предотвратить перезапись переменной на значение по-умолчанию?
для начала было бы неплохо определиться с конечной задачей, а не с тем, как вы ее хотите решить. Если это какая-то настройка приложения, которая должна пережить перезапуск - значит нужно ее хранить там, где положено - в SharedPreferences. Если это временное состояние, которое должно пережить перезапуск, но не должно храниться вечно, то нужно его сохранять и восстанавливать на уровне activity в onsaveinstancestate / onrestoreinstancestate. И естественно, если есть многопоточный доступ к этим данным, нужна синхронизация чтения/записи (в случае SharedPreferences не нужно, т.к. они потокобезопасны).
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063168
Slon747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha
Slon747
Скажите, как можно предотвратить перезапись переменной на значение по-умолчанию?
для начала было бы неплохо определиться с конечной задачей, а не с тем, как вы ее хотите решить. Если это какая-то настройка приложения, которая должна пережить перезапуск - значит нужно ее хранить там, где положено - в SharedPreferences. Если это временное состояние, которое должно пережить перезапуск, но не должно храниться вечно, то нужно его сохранять и восстанавливать на уровне activity в onsaveinstancestate / onrestoreinstancestate. И естественно, если есть многопоточный доступ к этим данным, нужна синхронизация чтения/записи (в случае SharedPreferences не нужно, т.к. они потокобезопасны).


При запуске программа проверяет корректность лицензии. Если лицензия корректна, переменная "DemoVersion" получает значение false. И далее во всех активити данная переменная проверяется. Я специально разместил ее в Application, чтобы не зависеть от жизни активити. Т.е. не факт, что первая активити будет существовать. Т.е. боюсь получить "NullPointerException" при обращении к переменной через активити "MainActivity.DemoVersion".

SharedPreferences не хочется использовать. Нужно проверять лицензию при каждом запуске.
Пока что приходит в голову переделать тип в перечисление. И если значение null, то заново проверять лицензию и устанавливать значение переменной.
Но может есть более правильный способ?
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063182
Slon747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще.
Если в Application в onCreate() я создаю экземпляр класса:

new Settings();

то значит после возврата приложения из фона создастся новый экземпляр Settings() ?
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063208
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slon747
то значит после возврата приложения из фона

когда приложение находится в фоне, оно может быть уничтожено (но не обязательно) и создано заново, если пользователь переключится на него снова. Зависит это в основном от кол-ва свободной памяти в системе - чем ее меньше, тем больше шансов, что система начнет убивать приложения в фоне. Если свернешь и сразу восстановишь - ничего скорее всего не случится. Естественно в случае убийства и перезапуска onCreate и все остальное выполнится снова. Об этом нужно помнить и сохранять данные, которые должны пережить "смерть в фоне". Например, если пользователь ввел какой-то текст, но нигде его не сохранил. Тоже касается и служебной информации вроде твоей статической переменной - ее значение станет по-умолчанию, т.е. как при первом старте. Эту ситуацию можно воспроизвести искусственно - свернуть приложение в фон, убить его (в окне logcat в Android Studio / Idea в самом низу слева есть красная кнопка "стоп" Terminate application), после этого запустить приложение через список последних запущенных приложений.
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063251
Slon747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha
Slon747
то значит после возврата приложения из фона

когда приложение находится в фоне, оно может быть уничтожено (но не обязательно) и создано заново, если пользователь переключится на него снова. Зависит это в основном от кол-ва свободной памяти в системе - чем ее меньше, тем больше шансов, что система начнет убивать приложения в фоне. Если свернешь и сразу восстановишь - ничего скорее всего не случится. Естественно в случае убийства и перезапуска onCreate и все остальное выполнится снова. Об этом нужно помнить и сохранять данные, которые должны пережить "смерть в фоне". Например, если пользователь ввел какой-то текст, но нигде его не сохранил. Тоже касается и служебной информации вроде твоей статической переменной - ее значение станет по-умолчанию, т.е. как при первом старте. Эту ситуацию можно воспроизвести искусственно - свернуть приложение в фон, убить его (в окне logcat в Android Studio / Idea в самом низу слева есть красная кнопка "стоп" Terminate application), после этого запустить приложение через список последних запущенных приложений.


Это я понимаю. Но проблема возникает из-за того, что, приложение не полностью выгружается из памяти, а переменная тем не менее получает начальное значение, как при объявлении.
Если бы полностью выгружалось, то и проблемы с данной переменной не возникло, т.к. ей присваивалось бы значение согласно проверки лицензии.
...
Рейтинг: 0 / 0
Статическая переменная в классе Application
    #40063288
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slon747
переменная тем не менее получает начальное значение

Значит ошибка в работе логики приложения и/или в твоем понимании того, как оно работает. Но для начала убей приложение в фоне, как я описал выше, и протестируй его поведение
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Статическая переменная в классе Application
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]