2015-03-13 2 views
0

В моем приложении (что это игра), у меня есть класс «врага», например, так:Восстановление ArrayList из пользовательских объектов

public class Enemy extends Sprite implements Serializable { 

    public Enemy(EnemyType type){ 
     super(); 
    } 

} 

Я тогда объявлен ArrayList так:

ArrayList<Enemy> enemyList = new ArrayList<Enemy>(); 

на что я могу добавить врагов:

enemyList.add(bird); 
enemyList.add(bee); 

При сохранении в Узле я просто положить:

bundle.putSerializable("Enemies", enemyList); 

И при восстановлении из Bundle, у меня есть:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies"); 

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

Я также зарегистрировал, например, первый индекс ArrayList и, конечно же, перечисляет экземпляр врага как находящийся там.

Однако, если я пытаюсь манипулировать ArrayList в любое время после восстановления, я получаю исключение, говорящее мне о том, что я пытаюсь выполнить [любое действие] для объекта Null (enemyList).

Если я просто заполнить список сам, так что есть что-то вроде:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies"); 
enemyList.add(bird); 
enemyList.add(bee); 

Тогда все работает, как ожидалось.

Я предполагаю, что это связано с тем, что суперкласс Enemy не сериализуется? Однако, если я сериализую это, я получаю ошибку «notSerializableException».

Обратите внимание: я не очень беспокоюсь о сохранении/восстановлении реальных объектов Enemy в Bundle, я могу справиться с этим вручную. Скорее я просто хочу, чтобы список находился в том же состоянии, что и было. И я думал, что то, что хранилось в ArrayList, было просто ссылкой на объекты, о которых идет речь, поэтому я не могу понять, почему это происходит?

Любые идеи, что я делаю неправильно, или есть лучший способ достичь того, чего я пытаюсь достичь?

+0

Скорее я просто хочу, чтобы список находился в том же состоянии, что и было, вы имеете в виду, что получаете правильное значение, но пользовательский интерфейс не обновляется? –

+0

Зачем сохранять список в 'Bundle'? – Xcihnegn

+0

@Xcihnegn, потому что мне нужно, чтобы оно находилось в том же состоянии, что и раньше. Это должно сохранить состояние игры, если система убивает приложение (например, пользователь получает телефонный звонок во время игры, возвращается к нему через час после того, как ОС убила приложение - мне нужно все, чтобы его сохранить, чтобы он мог забрать где он остановился - сохранение текущего состояния текущего объекта не является проблемой, но я не знаю, как оставить список в целости). – Zippy

ответ

0

Рекомендуемый способ сделать это в Android - сделать объекты, которые вы хотите сохранить Parcelable. Это тип сериализации, характерный для Android. Посмотрите официальную документацию here

+0

Спасибо @RaresBarbantan, но проблема заключается не в том, как сохранить состояние объекта, я уже могу это сделать (на самом деле, я использовал Parcelable в прошлом, но в настоящее время делаю это вручную, сохраняя только те свойства, которые я хочу скорее, чем создание целого объекта Parcelable). Проблема, с которой я столкнулся, заключается в том, как отправить и получить ArrayList (полный пользовательских объектов) в/из Bundle. Мне просто нужно, чтобы ArrayList находился в одном состоянии и имел возможность доступа к объектам внутри него (все объекты воссозданы, когда приложение перезаписано в любом случае, поэтому мне не нужно их сохранять в любом случае). – Zippy

+0

Именно это и есть цель Parcelable. Даже класс Bundle определяется как «Отображение от значений String к различным параметрам Parcelable» –

+0

вы говорите, что это невозможно, используя «serializable»? (Я прочитал несколько сообщений, которые рекомендуют использовать это). Я в настоящее время не использую Parcelable и предпочитаю держать его таким, если это возможно. – Zippy

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