Список массивов не сохраняется при паузе

#android #opengl-es #load #arraylist #onpause

#Android #opengl-es #загрузить #список массивов #onpause

Вопрос:

Моя игра для Android содержит данные макета уровня в списке массивов. Во время тестирования моего загрузчика уровней я заметил, что иногда мои уровни не загружались, оставляя меня только с черным экраном. Сначала я подумал, что, возможно, мои текстуры не загружаются повторно, но я доказал это неправильно, нарисовав объект отдельно от списка массивов, и он отлично нарисовался. Затем я использовал тег журнала, чтобы проверить размер моего списка массивов. Как только я нажал home, а затем снова открыл свое приложение, тег журнала начал возвращать нулевой размер, что означает, что все мои данные были потеряны. Теперь я действительно не хочу загружать данные моего уровня из файла каждый раз, когда вызывается onPause, так есть ли способ сохранить данные, хранящиеся в ArrayList?

Ответ №1:

Проблема в том, что вы, вероятно, собираете мусор (т. Е. Ваша пауза становится уничтожением из-за проблем с памятью). Внедрите методы onSaveIntstanceState и onRestoreInstanceState в свою деятельность, чтобы посмотреть, решит ли это проблему.

Num1 сделал хороший момент в комментарии, который, я считаю, стоит отметить. Обратите внимание, что пакеты должны содержать небольшие объемы данных. Если ваш список массивов большой, вероятно, поэтому ваша активность собирает мусор в том же месте. Если это так, у вас есть один из двух вариантов. Явно сохраняйте данные на диске самостоятельно в методе onDestroy (таким образом, вы делаете это только тогда, когда вам действительно нужно, запись на диск может занять некоторое время) или пересчитываете данные, когда ваша активность возвращается в фокус. Это просто что-то хорошее, о чем стоит подумать.

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

1. что-нибудь особенное, что я должен сделать, чтобы вернуть его из пакета, или он будет там, когда приложение возобновит работу

2. Я предполагаю, что сам пакет в какой-то момент будет уничтожен, но прав ли я, думая, что onCreate будет вызван снова, если это произойдет?

3. Пакет никогда не будет уничтожен. Когда gc выполняется, вызывается onSaveInstanceState, и записанный вами пакет сохраняется где-то не в памяти. Когда onCreate вызывается снова (или onRestoreInstance), в пакете, который вы получаете, будет содержаться материал, который вы сохранили в onSaveInstanceState .

4. Но не воспринимайте это как лицензию на помещение тонны данных в пакет! Если данные можно легко восстановить, выбросьте их, если их много, сохраните их в базе данных. Если он должен сохраняться между действиями, используйте общие настройки.

5. num1 делает очень хороший вывод. Я собираюсь добавить это к своему ответу.