/ / Android: Parcelable.writeToParcel и Parcelable.Creator.createFromParcel никога не се извикват - java, android, bundle, parcelable

Android: Parcelable.writeToParcel и Parcelable.Creator.createFromParcel никога не се наричат ​​- java, android, пакет, parcelable

Аз съм напълно нов за публикуване на въпроси тук,обаче чета много тук от години. Обикновено винаги успявам да намеря отговорите си чрез задълбочено търсене в мрежата, но този път съм в загуба ...

След като прекарах още един ден в опити да разбера защо това не работи, реших да помоля за помощ, надявайки се, момчета, да ми дадете няколко указателя или по-добре решение.

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

В моите функции onStop и onStart съответнозапазвам и възстановявам състоянието на играта от и от пакет, но когато извикам функциите 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.

Какво ли липсвам тук?

Всяка помощ / мисли ще бъде оценена.

Отговори:

10 за отговор № 1

Очевидно класът на Android Bundle не се придържа към протокол за разделяне което вместо това се следва по време на IPC маршируване.

Вместо това изглежда като Bundle реализацияпросто пише и чете обекта Parcelable в собствената си вътрешна карта чрез размисъл. От тест, който направихме, изглежда, че Bundle пише / чете всяко поле, дефинирано във вашия произведен от Parcelable клас, само защото сте декларирали тези полета.


4 за отговор № 2

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

Също така, може да искате да проверите http://developer.android.com/guide/topics/resources/runtime-changes.html


0 за отговор № 3

Потвърждавам казаното от superjos. В събитието saveToBundle, пакетът Android просто съхранява членовете на класа по отражение и не извиква функциите Parcelable. Загубих един ден по този проблем! тъжно ....

Това е наистина лошо .... Това означава, че потенциално съхранявате огромно количество данни за нищо, използвайки този начин.