Аз съм напълно нов за публикуване на въпроси тук,обаче чета много тук от години. Обикновено винаги успявам да намеря отговорите си чрез задълбочено търсене в мрежата, но този път съм в загуба ...
След като прекарах още един ден в опити да разбера защо това не работи, реших да помоля за помощ, надявайки се, момчета, да ми дадете няколко указателя или по-добре решение.
Проблемът: В 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. Загубих един ден по този проблем! тъжно ....
Това е наистина лошо .... Това означава, че потенциално съхранявате огромно количество данни за нищо, използвайки този начин.