Per la mia applicazione Android, ottengo diversi errori di riarrangiamento anche se penso di aver fatto tutto ciò che è necessario per salvare e caricare correttamente gli oggetti tramite Parcelable
s. Puoi dirmi cosa c'è di sbagliato nel mio codice?Errori di riarrangiamento nell'app per Android con classi parcelable personalizzate
di errore 1:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 6619241 at offset 1372
at android.os.Parcel.readValue(Parcel.java:1922)
at android.os.Parcel.readMapInternal(Parcel.java:2094)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:860)
at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012)
at android.app.Activity.performCreate(Activity.java:4465)
Linea 1012 nel MyActivity
è la chiamata a super.onCreate(savedInstanceState);
in s' onCreate()
il Activity
.
protected void onSaveInstanceState(Bundle savedInstanceState) {
if (myObject == null) {
savedInstanceState.putParcelable("myObject", null);
}
else {
savedInstanceState.putParcelable("myObject", myObject);
}
savedInstanceState.putInt(...);
savedInstanceState.putString(...);
savedInstanceState.putBoolean(...);
super.onSaveInstanceState(savedInstanceState);
}
myObject
è di classe MyObject
che ha i seguenti metodi:
public void writeToParcel(Parcel out, int flags) {
out.writeIntArray(...);
out.writeInt(...);
out.writeStringArray(...);
out.writeString(...);
out.writeParcelableArray(..., flags);
}
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
try {
if (in == null) {
return null;
}
else {
return new MyObject(in);
}
}
catch (Exception e) {
return null;
}
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
private MyObject(Parcel in) {
in.readIntArray(...);
... = in.readInt();
in.readStringArray(...);
... = in.readString();
... = (OtherObject[]) in.readParcelableArray(OtherObject.class.getClassLoader());
}
Errore 2:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:
at android.os.Parcel.readParcelable(Parcel.java:1971)
at android.os.Parcel.readValue(Parcel.java:1859)
at android.os.Parcel.readMapInternal(Parcel.java:2099)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:905)
at my.app.package.PlayComputer.onCreate(SourceFile:1012)
stessi file e le classi.
Errore 3:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7340149 at offset 1276
at android.os.Parcel.readValue(Parcel.java:1913)
at android.os.Parcel.readMapInternal(Parcel.java:2083)
at android.os.Bundle.unparcel(Bundle.java:208)
at android.os.Bundle.getParcelable(Bundle.java:1100)
at my.app.package.PlayComputer.onCreate(SourceFile:1111)
Questa volta, la linea che causa (1111) è la seguente:
myObject = (MyObject) savedInstanceState.getParcelable("myObject");
Il costruttore di GameState (Parcel in) è un errore di battitura e si intendeva scrivere un costruttore MyObject (Parcel in)? – fedepaol
@fedepaol: Sì, mi dispiace! – caw
Stai creando separatamente gli oggetti array nel tuo costruttore? I metodi 'readXXXArray()' richiedono un'istanza dell'array completamente inizializzata da passare. È possibile utilizzare i metodi 'createXXXArray()' per ottenere una nuova istanza di tale array restituita all'utente. – Devunwired