Intereting Posts
Android: Лучше ли создавать новый фрагмент каждый раз при щелчке элемента навигационного элемента или загружать ранее созданные фрагменты? Как программно отображать / скрыть навигационный ящик Java.security.InvalidKeyException: Недопустимый размер ключа или параметры по умолчанию в android Где находится временная папка в устройстве Android? Каков самый быстрый способ изучить Android и быстро начать разработку приложений? Обновление родной библиотеки не работает на Android Push-уведомления в платформе Android Службы Google Play Game для настольной игры Отладка базы данных sqlite на устройстве Android рисует линию, которая следует за вашим пальцем Хорошие примеры не-игровых приложений Marmalade? Ошибка раздувания фрагмента класса – дублирование id / нелегального запуска? Получите день рождения для каждого контакта в приложении Android Перенесите InputStream на другую службу (через границы процесса) с помощью ParcelFileDescriptor.createPipe (), которая не работает с «EBADF (Bad file number)» Камера Android – Как я могу взять конкретный «прямоугольник» из массива байтов?

Android: Parcelable.writeToParcel и Parcelable.Creator.createFromParcel никогда не называются

Я совершенно новый, чтобы задавать вопросы здесь, однако я много читал здесь много лет. Обычно я всегда могу найти ответы, тщательно просматривая веб-страницы, но на этот раз я в недоумении …

Проведя еще один день, пытаясь понять, почему это не работает, я решил обратиться за помощью, надеясь, что вы, ребята, можете дать мне несколько указателей или, лучше, решение.

Проблема: в Android-игре я пришел к тому моменту, когда я должен заставить приложение запомнить его состояние, когда пользователь, например, нажимает кнопку HOME. После некоторых поисков я понял, что для того, чтобы мои классы инициализировались обратно в соответствующие состояния после повторного открытия приложения, мне пришлось поддерживать интерфейс Parcelable, чтобы передать их с помощью Bundle.

В моих onStop и onStart-функциях я соответственно сохраняю и восстанавливаю состояние игры в Bundle и из него, однако, когда я вызываю функции putParcelable и getParcelable на Bundle, функции writeToParcel объекта и функции createFromParcel никогда не вызываются.

Опасаясь, что это, возможно, было связано с относительной сложностью игры, я решил, что лучше всего создать очень простое приложение, чтобы попытаться заставить его работать.

Основываясь на многих Примерах, которые я видел в Интернете, это стало моим классом:

public class ParcelableTest implements Parcelable { int id; public ParcelableTest(int newID) { id = newID; } private ParcelableTest(Parcel in) { readFromParcel(in); } public void writeToParcel(Parcel out, int arg1) { writeToParcel(out); } public void writeToParcel(Parcel out) { Log.v("ParcelableTest","Writing to parcel"); out.writeInt(id); } public void readFromParcel(Parcel in) { id = in.readInt(); } public int describeContents() { return 0; } public static final Parcelable.Creator<ParcelableTest> CREATOR = new Parcelable.Creator<ParcelableTest>() { public ParcelableTest createFromParcel(Parcel in) { Log.v("ParcelableTest","Creating from parcel"); return new ParcelableTest(in); } public ParcelableTest[] newArray(int size) { return new ParcelableTest[size]; } }; } 

И из моего основного действия я бы назвал следующие функции для сохранения / восстановления данных:

 public Bundle saveToBundle(Bundle savedState) { savedState.putParcelable("Test1",mTest1); savedState.putParcelable("Test2",mTest2); return savedState; } public void restoreFromBundle(Bundle savedState) { mTest1 = savedState.getParcelable("Test1"); mTest2 = savedState.getParcelable("Test2"); } 

Но по какой-то причине ни одна из функций (с функциями putParcelable и getParcelable) не приведет к соответствующим методам Parcelable в моем тестовом классе.

Самое странное, что он как-то читает правильные значения (я пробовал с большим количеством переменных в классе), но моя отладка и мой журнал показывают, что приложение никогда не получает writeToParcel и createFromParcel.

Что мне здесь не хватает?

Любая помощь / мысли будут оценены.

Solutions Collecting From Web of "Android: Parcelable.writeToParcel и Parcelable.Creator.createFromParcel никогда не называются"

По-видимому, класс Android Bundle не соответствует строгому протоколу, который вместо этого выполняется во время сортировки IPC.

Вместо этого кажется, что реализация Bundle просто записывает и читает объект Parcelable в свою собственную внутреннюю карту посредством отражения. Из теста, который мы сделали, кажется, что Bundle пишет / читает каждое поле, определенное в вашем производном от Parcelable, только потому, что вы объявили эти поля.

Технически документация не говорит, что writeToParcel или createFromParcel из onSaveInstance . На самом деле, если вы проверите сохраненное savedState в коде, вы обнаружите, что это точно такой же экземпляр объекта как в случае сохранения, так и в случае восстановления; Имеет смысл избегать сериализации-десериализации, если можно.
OTOH, в документации не говорится, что сериализация не выполняется. Вывод должен состоять в том, что вы не должны зависеть ни от одного из них, просто предположите, что вы получите правильный комплект.

Кроме того, вы можете проверить http://developer.android.com/guide/topics/resources/runtime-changes.html

Я подтверждаю, что сказал суперджос. В событии saveToBundle пакет Android просто хранит члены класса для каждого отражения и не вызывает функции Parcelable. Я потерял один день на эту проблему! грустный….

Это очень плохо …. Это означает, что вы потенциально храните огромное количество данных впустую, используя этот способ.