@Deadkenny

Жизненный цикл Activity, как кэшируются данные при изменении конфигурации?

Решил уйти от Loader и в будущем от фрагментов в Android и в процессе переосмысления появился вопрос как AsyncTaskLoader кэширует данные? После изменения конфигурации мы инициализируем Loader (initLoader) и если он уже существует и у него до этого были возвращены некоторые данные через deliverResult, то он возвращает их заново.
Покопавшись в исходниках фрагментов и лоадеров я понял что при изменении конфигурации LoaderManager сохраняет все существующие лоадеры, а потом восстанавливает их обратно. То есть Activity контролирует жизненный цикл всех Fragment через FragmentManager, который в свою очередь контролирует жизненный цикл Loader через LoaderManager.

В итоге я хочу спросить знающих. Правильно ли я понимаю что на уровне ОС создается инстанс Activity, который при изменении конфигурации не уничтожается, а отвязывается от контекста, а после привязывается к новому контексту и следовательно все поля и объекты внутри Activity остаются вплоть до вызова onDestroy? И если я не прав, то как Activity хранит LoaderManager при изменении конфигурации? Навряд ли через статические переменные. Могу ли я привязаться к жизненному циклу Activity, чтобы там хранить кэшированные данные сессии своего лоадера, которые я буду уничтожать в соответствии с жизненным циклом Activity?
P.S. Я не хочу использовать статические переменные и синглтоны.
P.S.S. Уже после написания вопроса нашел в исходнике Activity связку класс для хранения объектов, которые не изменяются при изменении конфигурации:
/*Activity.java*/
static final class NonConfigurationInstances {
        Object activity;
        HashMap<String, Object> children;
        List<Fragment> fragments;
        ArrayMap<String, LoaderManager> loaders;
        VoiceInteractor voiceInteractor;
    }
/* package */ NonConfigurationInstances mLastNonConfigurationInstances;

Из этого следует что ОС все таки уничтожает Activity.

TL;DR Я использую MVP. Как мне привязать кэширование данных моего Presenter не завязываясь на Fragments, не использую базу данных, не сохраняя данные в sharedpreferences, а только сохраняя кэш в виде объектов и используя жизненный цикл и методы Activity?
  • Вопрос задан
  • 935 просмотров
Решения вопроса 1
@Deadkenny Автор вопроса
Порывшись в интернете нашел ответ на свой вопрос.

blog.bradcampbell.nz/mvp-presenters-that-survive-c...

Этот парень создает некий Кэш, в котором он хранит все актуальные представления, добавляет новые и удаляет старые. При необходимости все представления формируются в объект, который отдается на хранение к Activity через метод onRetainCustomNonConfigurationInstance. После того как Activity пересоздалась нужно достать сохраненный объект с помощью getLastCustomNonConfigurationInstance и загрузить это все обратно в Кэш менеджер представлений.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gadfi
@gadfi
https://gamega.org
магии нет.
совсем нет.
да, многим кажется что если они напишут android:configChanges="orientation|screenSize" в манифесте добрый волшебник скажет крибли-крабли бумс и все станет хорошо но это не так...
о том чтобы при смене ориентации сохранялись ваши данные думают или лоадеры(хотя в первую очередь они не для этого) что то другое, но во всех случаях вы сами, в зависимости от вашей архитектуры и инструментов

зы смена ориентации самый частый но не единственный повод для беспокойства
Ответ написан
@lomikman
Попробуй использовать dagger2.
Где нужно использовать твой презентер делаешь
@Inject Presenter presenter
там где твой класс презентера можно прописать @Singleton и тогда будет использоваться один инстанс на весь апп и сможешь переиспользовать его где угодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы