восстановление состояния активности с помощью getLastNonConfigurationInstance генерирует непроверенное предупреждение о приведении - PullRequest
1 голос
/ 23 февраля 2011

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

Поскольку возвращаемый аргумент - один объект, и я хочу вернуть два элемента, я нашел следующее решение:

@Override
public Object onRetainNonConfigurationInstance() {

    HashMap< String, Object> data = new HashMap<String, Object>();

    data.put( "mAdapter", getExpandableListAdapter() );
    data.put( "folderList", folderList );

    return data;

}

Когда я собираю данные в моем методе onCreate с помощью:

HashMap<String, Object> savedData = ( HashMap< String, Object> ) getLastNonConfigurationInstance();

Я получаю непроверенное предупреждение о приведении от компилятора. Я предполагаю, что это потому, что компилятор не может определить, действительно ли HashMap с указанными типами будет в объекте, возвращаемом getLastNonConfigurationInstance. Затем я приведу Объекты в HashMap к нужным типам данных. У меня вопрос такой:

Является ли это безопасным способом передачи нескольких фрагментов данных в операцию onCreate, когда я знаю, что данные будут возвращены в виде HashMap (потому что я их там хранил)?

Я думаю, что могу подавить предупреждение с помощью @SuppressWarnings ("unchecked"), но я хочу быть уверенным, что мой код действителен.

С уважением, Ivo

1 Ответ

2 голосов
/ 23 февраля 2011

Зачем использовать хэш-карту вместо простого структурирующего класса хранения, когда вы знаете полный набор содержимого во время компиляции?

Кроме того, остерегайтесь передачи всего, что содержит ссылку на контекст / действие между действиямитакие случаиСкорее всего, передаваемый вами адаптер содержит ссылку на Context, чтобы он мог получить FlaoutInflater для раздувания представлений элементов.Это будет иметь два негативных эффекта:

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

Именно поэтому этот метод называется «неконфигурационный экземпляр»."Правильно возвращать объекты, на которые не влияет конфигурация.В случае чего-то вроде адаптера, который содержит контекст, передайте данные, к которым обращается адаптер, а не сам адаптер, и создайте новый адаптер в новом экземпляре действия.

...