Хранилище Android: onSavedInstanceState не работает?

#java #android #state

#java #Android #состояние

Вопрос:

Я прочитал SO и, похоже, не могу найти никаких ответов относительно моей проблемы. У меня есть ArrayList пользовательских объектов, которые реализуют Parcelable called listOfBuddies . Я пытаюсь сохранить его состояние, используя следующий код…

 @Override
public void onSaveInstanceState(Bundle buddies){
    buddies.putParcelable("buddies", listOfBuddies);
    super.onSaveInstanceState(buddies);
}
@Override
public void onRestoreInstanceState(Bundle buddies) {
  listOfBuddies = buddies.getParcelable("buddies");
  super.onRestoreInstanceState(buddies);
}
public void onStart(Bundle buddies) {
    super.onStart();
    listOfBuddies = buddies.getParcelable("buddies");
    }

@Override
public void onCreate(Bundle buddies) {
    super.onCreate(buddies);
    setContentView(R.layout.buddylist);
    if(buddies != null){
        listOfBuddies = buddies.getParcelable("buddies");
    }
}
  

Однако buddies всегда возвращает значение null в onCreate после перезапуска Acitivty. Возможно, я ошибаюсь… но в принципе я хотел бы хранить ArrayList объектов до тех пор, пока работает мое приложение.

Комментарии:

1. Я могу, по крайней мере, добавить, что пакет вызывается во время onCreate или onRestoreInstanceState (в документах говорится, что он передается обоим), поэтому я бы удалил то, что у вас есть в OnStart, и, честно говоря, просто взял его только в onCreate, чтобы упростить ситуацию. Хотя почему это не работает… Я не уверен.

2. Я не знаю, является ли это вашей проблемой: если пользователь завершает действие, действие будет воссоздано без состояния сохраненного экземпляра. Это происходит только в том случае, если Android (временно) завершает действие и создает его заново, т. Е. при изменении ориентации, ситуациях с нехваткой памяти и т.д.

3. @sstn это было бы не так, я получаю это при нажатии кнопки «Назад» на телефоне и повторном запуске действия.

Ответ №1:

Я не уверен, что это сработает, но у меня есть предложение. Вместо того, чтобы самому ArrayList реализовывать Parcelable, попробуйте настроить свой пользовательский объект на реализацию Parcelable вместо этого. Затем используйте putParcelableArrayList и getParcelableArrayList для извлечения списка.

Ответ №2:

onSaveInstanceState вызывается только при программном отключении, таком как изменение ориентации телефона. При жестком уничтожении вам нужно будет сохранить состояние активности, возможно, путем записи в prefs. Если вы выберете этот метод сохранения состояния, то само собой разумеется, что вам нужно будет прочитать в prefs, если пакет равен null. Итак, логика выглядит следующим образом:

Установите флаг isSaveInstanceState равным false в onResume, установите флаг равным true в onSavedInstanceState в onStop, если!isSavedInstanceState записывает в префы

В onCreate:

Если bundle != null, извлеките состояние из пакета, иначе извлеките состояние из префиксов

Документоподобные данные — это другой объект, и они могут сохраняться при записи в базу данных в onPause.