2012-03-15 11 views
6

Ho un problema con Parcelable dati in un ArrayList invio tramite due attività che utilizzano Android.BundleAndroid | Unmarshalling tipo sconosciuto durante l'utilizzo Parcelable dati in bundle

Ho due attività (A e B).

In Aaaa.class:

ArrayList<Model> mModelList = new ArrayList<Model> 
//Fill ArrayList with a few Model-Objects 

Bundle mBundle = new Bundle; 
Intent mIntent = new Intent(Aaaa.this, Bbbb.class); 

mBundle.putParcelableArrayList("models", mModelList); 
mIntent.putExtras(mBundle); 

startActivity(mIntent); 

In Bbbb.class:

Bundle mBundle = getIntent().getExtras(); 
ArrayList<Model> = mBundle.getParcelableArrayList("models"); 

Il Model.class sta attuando Parcelable.

Quindi, il problema è. Quando riempio l'ArrayList (in Aaaa.class) e lo metto nel Bundle, posso vedere che il Bundle contiene gli oggetti vari dalla Lista. Quando provo a riempire l'elenco in Bbbb.class viene generata un'eccezione.

ERROR/AndroidRuntime(11109): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{test/test.activities.Bbbb}: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7667810 at offset 144 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3687) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7667810 at offset 144 
    at android.os.Parcel.readValue(Parcel.java:1913) 
    at android.os.Parcel.readListInternal(Parcel.java:2092) 
    at android.os.Parcel.readArrayList(Parcel.java:1536) 
    at android.os.Parcel.readValue(Parcel.java:1867) 
    at android.os.Parcel.readMapInternal(Parcel.java:2083) 
    at android.os.Bundle.unparcel(Bundle.java:208) 
    at android.os.Bundle.getParcelableArrayList(Bundle.java:1144) 
    at test.activities.Bbbb.onCreate(Bbbb.java:52) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
    ... 11 more 

Line52 è

ArrayList<Model> = mBundle.getParcelableArrayList("models"); 

non ho assolutamente idea di dove è il problema qui, il Model.class sta lavorando bene con altri bundle - Intenti.

Aggiornamento:

La classe del modello come segue.

public class Model implements Parceleble{ 

    private String name; 
    private String address; 

    public Model(Parcel parcel){ 
    } 
    public Model(){ 
    } 
    public Model(String name, String address){ 
    this.name = name; 
    this.address = address; 
    } 

    //Getter and Setter 

    //equals, HashCode, toString (autoGenerated from Idea) 

    @Override 
    public void writeToParcel(Parcel parcel, int i){ 
    parcel.writeString(name); 
    parcel.writeString(address); 
    } 

    public void readFromParcel(Parcel parcel){ 
    this.name = parcel.readString(); 
    this.address = parcel.readString(); 
    } 

    public static Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>(){ 
    @Override 
    public Model createFromParcel(Parcel parcel){ 
    return new Model(parcel); 
    } 

    @Override 
    public Model[] new Array(int size){ 
    return new Model[size] 
    } 
}; 
} 
+0

Puoi pubblicare la tua lezione di modello? – yorkw

+0

@yorkw Postare la Model.class come desiderato. – Chris

risposta

5

L'implementazione Parceleble non sembra del tutto corretto per me, controllare il codice di esempio in API per vedere quali sono le richieste metodo/costruttore che ha bisogno di essere sovrascritta:

... ... 

// ==================== Parcelable ==================== 
public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel parcel, int flags) { 
    parcel.writeString(name); 
    parcel.writeString(address); 
} 

private Model(Parcel in) { 
    name = in.readString(); 
    address = in.readString(); 
} 

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() { 
    public Model createFromParcel(Parcel in) { 
    return new Model(in); 
    } 

    public Model[] newArray(int size) { 
    return new Model[size]; 
    } 
}; 

... ... 

Prova questa codice e vedere se aiuta.

+0

Ciao @yorkw grazie mille per la tua risposta. Il problema era nell'implementazione del modello, in particolare nel pacco-Creatore (Modello privato (pacco in)). – Chris

+2

Non vedo come questo blocco di codice è diverso dal codice di classe del modello fornito dall'OP o è stato aggiornato in seguito? –

+0

Nell'implementazione di @ ChristianGarcía OP manca il metodo 'describeContents' che è molto importante in quanto spiega il contenuto del pacco (Oggetti al suo interno). Spero che tu sia chiaro ora. – sud007

1

Ho trascorso molto tempo per scoprire cos'è e penso che ci sia un bug. Mi spiego:

Se il vostro modello ha stringa campi Android non può recupero molto bene sul metodo

Parcel.readString() 

Egli cerca di convertire la stringa e dare a te un tipo sconosciuto come un personaggio sconosciuto Basta fare un test, se si utilizza un modello parcelable senza campi stringa, si verifica perfettamente.

Non so cosa fare e perché avvenga con campi stringa.

Per risolvere il problema, ho pensato di passare un elenco di oggetti del modello all'attività successiva utilizzando il database, forse non è l'idea migliore ma non ne ho un altro.

Problemi correlati