19

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

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

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

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

+0

http://stackoverflow.com/questions/15749106/onsaveinstancestate-vs-onretaincustomnonconfigurationinstance – petey

+0

Я использую 'андроида: configChanges = "клавиатура | keyboardHidden | ориентирование | screenLayout | uiMode | Размер экрана | smallestScreenSize"' 'для моего Activities'. Взято с https://developers.google.com/admob/android/quick-start. Предположительно, это не «лучшее» решение, но оно работает лучше, чем все, что я видел. –

+2

@JaredBurrows Я ценю ваш комментарий, но я разделяю мнение, что это не только * не лучшее решение *, но и неправильный и вредный способ справиться с потерей состояния в приложениях Android. Плюс это на самом деле не решает проблему (например, приложение подходит к фону) – wasyl

ответ

14

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

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

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

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

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

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

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

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

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

+0

Спасибо за ответ! Можете ли вы прокомментировать часть [источника активности] (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/app/Activity.java), строка 1758 , javadoc для метода 'onRetainNonConfigurationInstance()', который говорит * Эта функция называется чисто оптимизацией, и вы не должны полагаться на ее вызов. *? – wasyl

+0

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

+1

Конечно, но 'FragmentActivity', тот, который предоставляет' onRetainCustomNonConfigurationInstance', использует 'onRetainNonConfigurationInstance', который в классе' Activity' (поэтому его родительский) отмечен как ненадежный. Поэтому в методе 'FragmentActivity'' onRetainCustom ...' вызывается из 'onRetainNonConf ...', который переопределяется от родителя, в то время как документы родителя говорят, что его нельзя гарантировать. Извините, если я неясен, дайте мне знать, если мне нужно изменить то, что я имею в виду;) – wasyl

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

  • Нет связанных вопросов^_^