2016-03-07 3 views
1

У меня есть собственный класс приложений с множеством атрибутов экземпляра, и действия зависят от этих атрибутов. Иногда, когда активность находится в фоновом режиме, и я открываю приложение, происходят исключения с нулевым указателем. Я знаю, что причиной этой проблемы является то, что Android убивает приложение. Когда я открываю приложение, текущая активность создается снова, но теперь атрибуты приложения равны нулю.Как бороться с управлением памятью Android и обратным вызовом onTrimMemory?

У меня есть два варианта решения этой проблемы. Оба решения требуют, чтобы метод onTrimMemory очищал кэш приложения, когда уровень TRIM_MEMORY_MODERATE или выше.

1º - Когда кеш очищается и приложение открывается, текущая активность завершается, если требуемый атрибут приложения равен нулю. Только основное действие снова загрузит атрибуты приложения. Это требует меньше работы, потому что большинство рефакторингов будет происходить в основном действии.

2º - Рефакторинг всех действий для загрузки всех необходимых данных из бэкэнд каждый раз, когда атрибут приложения равен нулю. Здесь у меня много работы, потому что все действия должны быть независимыми и должны знать, как загрузить свои собственные данные.

Каков наилучший способ борьбы с этим поведением Android? Как вам решить эту проблему? Что мне нужно сделать, чтобы предотвратить эти нулевые указатели, когда данные кэша удаляются из пользовательского класса приложения?

ответ

0

Я не знаю много о вашей архитектуры хранилища данных там, но вы должны следовать этим правилам:

  1. TRIM_MEMORY_BACKGROUND - попробуйте удалить все примерно необходимые ресурсы, вещи, которые вы знаете, вам не нужно будет повторно - начать Ваша деятельность
  2. TRIM_MEMORY_MODERATE - вы можете очистить также некоторые деятельности, необходимые ресурсы, которые могут быть легко загружены с помощью погрузчика или какой-то AsyncTask
  3. TRIM_MEMORY_COMPLETE - вы можете думать, чтобы очистить почти все в своем классе приложений и только держать минимально - необходимые данные для вашего приложения запустить и правильно восстановить состояние активности.

для тех, 3 выше I За исключением также рекомендуем использовать TRIM_MEMORY_UI_HIDDEN, который означает, что вы активность больше не видна, и вы можете освободить большой UI соответствующие ресурсы, особенно Bitmaps :) кэшированные в вашей деятельности.

+0

Я решил использовать TRIM_MEMORY_MODERATE, но мне нужно больше информации о том, как должны действовать действия при очистке кеша. Например, AsyncTask должен быть помещен в onResume? На данный момент я заканчиваю действия, когда атрибуты в кеше не найдены. –

+0

Вы не должны этого делать, вы не должны заканчивать свои действия вручную, только если это желаемое поведение в соответствии с вашим дизайном/функциональным потоком. Для действий вы должны в большинстве случаев использовать AsyncLoaders для загрузки необходимых ресурсов, они уже обрабатывают кэш для вас, и когда действие будет уничтожено, они будут очищены. –

+0

Самая большая проблема, с которой я сейчас сталкиваюсь, - это деятельность с четырьмя фрагментами (tabLayout). Они уже были сделаны ранее. Когда это действие возобновляется, мне нужно обновить все представления фактическими данными. OnResume активности называется первым и загружает базовые данные из бэкэнда. Фрагменты onResume работают параллельно, потому что активность onResume загружает вещи асинхронно. Фрагменты также загружают данные из бэкэнда. Это вызывает странное поведение в recyclerviews и других компонентах, потому что оно должно выполняться в порядке, как в первый раз, когда они загружаются. –

Смежные вопросы