#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.