Подтвердить что ты не робот

Использование `onRetainCustomNonConfigurationInstance` для сохранения данных при изменении конфигурации

Я программировал для Android в течение некоторого времени, и я все еще ищу решения для сохранения данных по изменениям конфигурации. Помимо сохранения Parcelable в Activity Bundle в onSaveInstanceState, документы предлагают использовать Fragment с флагом setRetainInstance, установленным в true.

Но я только что нашел код, который использует onRetainCustomNonConfigurationInstance для хранения произвольных объектов (по-фантастически, но по существу больших объектов без ссылок на Activity и т.д.). Я никогда не видел этот метод, поэтому у меня есть некоторые сомнения:

  • Этот метод безопасен для вызова для хранения произвольных объектов (в смысле, что я могу быть уверен, что он будет вызван, и что он не будет устаревшим/удаленным в ближайшее время)?
  • Как этот метод отличается от onRetainNonConfigurationInstance(), который также должен возвращать Object, и по существу должен работать аналогично?
  • По какой-то причине использование сохраненного фрагмента еще лучше?

В качестве бонуса я был бы признателен за любые другие советы или решения для сохранения состояния таких объектов, как AsyncTask, Observable, просмотр презентаторов и продолжение

4b9b3361

Ответ 1

Безопасен ли этот метод для вызова произвольных объектов (в некотором смысле что я могу быть уверен, что он будет вызван, и что это не будет устарели или удалены в ближайшее время)?

onRetainCustomNonConfigurationInstance() - относительно новый метод, и он не устарел. Я бы предположил, что скоро это не исчезнет, ​​потому что нет причин вводить что-то новое, просто чтобы удалить его. Вы можете использовать его безопасно.

Как этот метод отличается от onRetainNonConfigurationInstance(), который также должен возвращать Object, и по существу должен работать аналогично?

onRetainNonConfigurationInstance() всегда возвращает экземпляр внутреннего класса NonConfigurationInstances с сохраненными фрагментами, загрузчиками и т.д. Вы не можете (и не должны) изменять это поведение системы. Поэтому метод final, и вы не можете его переопределить.

Если вы хотите сохранить свой собственный экземпляр, вам нужно переопределить onRetainCustomNonConfigurationInstance() и вернуть его оттуда.

Фактически, onRetainNonConfigurationInstance() вызывает onRetainCustomNonConfigurationInstance() и сохраняет перенастроенный экземпляр с другими состояниями, такими как сохраненные фрагменты и загрузчики.

По какой-то причине лучше использовать сохранившийся фрагмент?

Это скорее вопрос вашего прецедента и предпочтений. Логика может быть такой. Если ваша деятельность просто контролирует фрагменты и не имеет в ней никакой другой специальной логики, то легче использовать сохранившиеся фрагменты. Если у вашей деятельности есть что-то, что нужно сохранить, вы можете безопасно использовать метод onRetainCustomNonConfigurationInstance(). На данный момент в обоих случаях состояние по-прежнему сохраняется старым и устаревшим способом onRetainNonConfigurationInstance().

p.s. Что касается вопроса о бонусе о сохранении состояния, я бы предпочел рассмотреть метод onSaveInstanceState(). Он предназначался для хранения состояний.