Глобальный объект (основанный на «расширении приложения») испаряется в одночасье .. почему? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть приложение для Android, где я расширяю объект приложения как таковой

public class Globals extends Application {
    private Map<String, Object> Creators = new LinkedHashMap<>();   
}

Globals содержит в себе различные вещи.обычно HashMaps вещей - я использую его как global json cache, где каждый Context имеет экземпляр этого.Теперь в одночасье кажется, что объект Application иногда может быть пустым.то есть я использую приложение, ухожу и засыпаю, возвращаюсь к тестированию утром, и все кеши json пусты.Но пользователь все еще "залогинен".Я предполагаю, что это из-за сборки мусора в ОС.

Сейчас.Я мог бы просто обновить json cache или принудительно выйти из системы, когда json cache пуст, но есть проблема - он может быть пустым, потому что не существует законного json с сервера.то есть "быть пустым" - это не повод, чтобы получить большеТо, что мне нужно сделать, это определить, когда андроид сплющил кэш, или, по крайней мере, знать минимальное время, в течение которого Android будет поддерживать расширение Application.

Будет ли установлено все значение null?

У кого-нибудь есть идеи?Имейте в виду, что контекст будет заново инициализировать нулевые члены HashMap Application в контексте в onCreate (что требуется по причине, выходящей за рамки видимости), потому что я объявляю new, но просто проверка на "null" недействительно вариант.Я полагаю, что пустое значение NULL, которое изменяется только на json gather, будет в порядке, но мне нужно ЗНАТЬ, что это сработает, или я потерял еще один день, гоняясь за этим (т. Е. ОЧЕНЬ сложно проверить)

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Теперь в одночасье оказывается, что объект Application иногда может быть пустым.то есть я использую приложение, ухожу и засыпаю, возвращаюсь к тестированию утром, и все кеши json пусты.

Ваш процесс, скорее всего, был прерван.См. документацию и документацию .

Что мне нужно сделать, это обнаружить, когда Android сплющил кэш

Вы не будете уведомлены о завершении вашего процесса.

или хотя бы знаете минимальное время, в течение которого Android будет хранить расширение приложения

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

[Application работает] отлично как хранилище данных

Только для данных, которые вы можете легко перезагрузить из постоянных данныхstore.

[Application] работает работает в многопоточности

Только если вы добавите свою собственную логику синхронизации потоков.В свойствах и функциях Application нет ничего волшебного, что делает их поточно-ориентированными.

, где нет места для хранения изменяемых данных - это лучшая альтернатива

Любые данные, которые вы хотите сохранить, должны храниться на диске (база данных, SharedPreferences или другие типы файлов) или на сервере.

, поэтому у меня остается вопрос, как их смягчить

Любые данные, которые вы хотите сохранить, должны храниться на диске (база данных, SharedPreferences или другие типы файлов) или на сервере.Используйте кеши в памяти в качестве кешей.

, потому что такие вещи, как SQLite, бесполезны, они не безопасны для потоков

Если вы используете один и тот же экземпляр SQLiteDatabase для своих операцийSQLite является поточно-ориентированным.

, что фактически делает невозможным параллельное выполнение чего-либо

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

2 голосов
/ 20 сентября 2019

Это не совсем ответ на ваш вопрос, но это слишком долго комментировать, но вы не должны хранить изменяемые данные в вашем классе, который выходит из Application:

см. Это для получения дополнительной информации (https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class)

, в котором конкретно сказано, что:

... вы никогда не должны хранить изменяемые данные экземпляра внутри объекта Application, потому что если вы предполагаете, что ваши данные останутся там, ваше приложение неизбежно будетв какой-то момент происходит сбой с NullPointerException. Объект приложения не гарантированно останется в памяти навсегда, он будет убит. Вопреки распространенному мнению, приложение не будет перезапущено с нуля. Android создаст новый объект Application и запуститдеятельность, в которой пользователь был раньше, чтобы создать иллюзию, что приложение никогда не было убито.

Итак, класс приложения также убивается, как и большинство других вещей, что означает (в вашем случае) он, вероятно, удаляется в какой-то момент, что вызывает большинствоВаши проблемы

возможно связаны: Значение переменных контекста приложения, потерянных при ошибке приложения

см. также: http://www.developerphil.com/dont-store-data-in-the-application-object/

Безопасно лииспользовать статические переменные класса в приложении для Android

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