У меня есть собственный класс приложений с множеством атрибутов экземпляра, и действия зависят от этих атрибутов. Иногда, когда активность находится в фоновом режиме, и я открываю приложение, происходят исключения с нулевым указателем. Я знаю, что причиной этой проблемы является то, что Android убивает приложение. Когда я открываю приложение, текущая активность создается снова, но теперь атрибуты приложения равны нулю.Как бороться с управлением памятью Android и обратным вызовом onTrimMemory?
У меня есть два варианта решения этой проблемы. Оба решения требуют, чтобы метод onTrimMemory очищал кэш приложения, когда уровень TRIM_MEMORY_MODERATE или выше.
1º - Когда кеш очищается и приложение открывается, текущая активность завершается, если требуемый атрибут приложения равен нулю. Только основное действие снова загрузит атрибуты приложения. Это требует меньше работы, потому что большинство рефакторингов будет происходить в основном действии.
2º - Рефакторинг всех действий для загрузки всех необходимых данных из бэкэнд каждый раз, когда атрибут приложения равен нулю. Здесь у меня много работы, потому что все действия должны быть независимыми и должны знать, как загрузить свои собственные данные.
Каков наилучший способ борьбы с этим поведением Android? Как вам решить эту проблему? Что мне нужно сделать, чтобы предотвратить эти нулевые указатели, когда данные кэша удаляются из пользовательского класса приложения?
Я решил использовать TRIM_MEMORY_MODERATE, но мне нужно больше информации о том, как должны действовать действия при очистке кеша. Например, AsyncTask должен быть помещен в onResume? На данный момент я заканчиваю действия, когда атрибуты в кеше не найдены. –
Вы не должны этого делать, вы не должны заканчивать свои действия вручную, только если это желаемое поведение в соответствии с вашим дизайном/функциональным потоком. Для действий вы должны в большинстве случаев использовать AsyncLoaders для загрузки необходимых ресурсов, они уже обрабатывают кэш для вас, и когда действие будет уничтожено, они будут очищены. –
Самая большая проблема, с которой я сейчас сталкиваюсь, - это деятельность с четырьмя фрагментами (tabLayout). Они уже были сделаны ранее. Когда это действие возобновляется, мне нужно обновить все представления фактическими данными. OnResume активности называется первым и загружает базовые данные из бэкэнда. Фрагменты onResume работают параллельно, потому что активность onResume загружает вещи асинхронно. Фрагменты также загружают данные из бэкэнда. Это вызывает странное поведение в recyclerviews и других компонентах, потому что оно должно выполняться в порядке, как в первый раз, когда они загружаются. –