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

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

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

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

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

1 ответов


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

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

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

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

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

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

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

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

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