2012-03-15 22 views
6

tengo un problema con parcelable de datos en un ArrayList envío a través de dos actividades que utilizan Android.BundleAndroid | Desconocido Tipo unmarshalling durante el uso de parcelable de datos en paquetes

Tengo dos ejercicios (A y B).

En 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); 

En Bbbb.class:

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

El Model.class está implementando parcelable.

Entonces, el problema es. Cuando llene ArrayList (en Aaaa.class) y lo coloque en el Bundle, puedo ver que el paquete contiene los diversos objetos de la lista. Cuando intento llenar la Lista en Bbbb.class, se lanza una excepción.

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 es

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

tengo absolutamente ninguna idea de dónde está el problema aquí, el Model.class está trabajando muy bien con otros Bundle - Intentos.

Actualización:

La clase del modelo como seguido.

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

¿Puedes publicar tu clase de modelo? – yorkw

+0

@yorkw Postet the Model.class como lo desea. – Chris

Respuesta

5

Su aplicación Parceleble no se ve del todo correcto para mí, echa un vistazo al código de ejemplo en API para ver cuáles son los requerida método/constructor que tiene que ser anulado:

... ... 

// ==================== 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]; 
    } 
}; 

... ... 

probar este codificar y ver si ayuda.

+0

Hola @yorkw muchas gracias por tu respuesta. El problema estaba en la implementación del modelo, especialmente en el paquete Creador (Modelo privado (parcela)). – Chris

+2

No veo cómo es este bloque de código diferente del código de clase modelo proporcionado por el OP, o es que se actualizó más tarde? –

+0

@ ChristianGarcía La implementación de OP le falta el método 'describeContents' que es bastante importante ya que explica sobre el contenido del paquete (Objetos dentro de él). Espero que estés claro ahora. – sud007

1

He pasado mucho tiempo para descubrir qué es eso y creo que hay un error. Me explico:

Si el modelo tiene cadena de campos del androide puede no recuperación de ellos muy bien en el método

Parcel.readString() 

Se trata de convertir la cadena y darle a usted un tipo desconocido como una personaje desconocido. Simplemente haciendo una prueba, si usa un modelo parcelable sin campos de cadena, ocurre a la perfección.

No sé qué hacer y por qué ocurre con los campos de cadenas.

Para resolver el problema, pensé en pasar una lista de objetos modelo a la siguiente actividad usando la base de datos, tal vez no sea la mejor idea, pero no tengo otra.

Cuestiones relacionadas