Pregunta

Estoy tratando de implementar parcelable en lugar de serializble, ya que se supone que es más eficiente. De mi MainActivity quiero pasar un objeto de mensaje a otra actividad, mi mensaje de clase contiene otras clases. Si paso este error, estoy seguro de que me ejecutaré mucho más de ellos, pero en este momento, cuando intento ejecutar mi aplicación, estoy recibiendo

Esta es mi clase de mensaje:

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class Message implements Parcelable {

    int id;
    int space_id;
    String text;
    String html;
    String created_at;
    int[] comments;
    boolean is_liked;
    int[] liked_by;
    int[] starred_by;
    boolean is_starred;
    boolean is_followed;
    int[] followed_by;
    ArrayList<AttachmentsData> attachments;
    String url;
    int[] tags;
    boolean is_system;

    public User created_by;
    public Permissions persmissions;
    public Embed embed;
    public Tokens[] tokens;


    /** Parcelable **/
    public Message(Parcel in) {
        readFromParcel(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) { 
        dest.writeInt(id);
        dest.writeInt(space_id);
        dest.writeString(text);
        dest.writeString(html);
        dest.writeString(created_at);
        dest.writeIntArray(comments);
        dest.writeInt(is_liked ? 1 : 0);
        dest.writeIntArray(liked_by);
        dest.writeIntArray(starred_by);
        dest.writeInt(is_starred ? 1 : 0);
        dest.writeInt(is_followed ? 1 : 0);
        dest.writeIntArray(followed_by);
        dest.writeList(attachments);
        dest.writeString(url);
        dest.writeIntArray(tags);
        dest.writeInt(is_system ? 1 : 0);

        dest.writeParcelable(created_by, flags);
        dest.writeParcelable(persmissions, flags);
        dest.writeParcelable(embed, flags);
        dest.writeParcelableArray(tokens, flags);
    }

    private void readFromParcel(Parcel in) {
        id = in.readInt();
        space_id = in.readInt();
        text = in.readString();
        html = in.readString();
        created_at = in.readString();
        //in.readIntArray(comments);
        comments = in.createIntArray();
        is_liked = in.readInt() == 0;
        //in.readIntArray(liked_by);
        liked_by = in.createIntArray();
        //in.readIntArray(starred_by);
        starred_by = in.createIntArray();
        is_starred = in.readInt() == 0;
        is_followed = in.readInt() == 0;
        //in.readIntArray(followed_by);
        followed_by = in.createIntArray();
        in.readList(attachments, AttachmentsData.class.getClassLoader());
        url = in.readString();
        //in.readIntArray(tags);
        tags = in.createIntArray();
        is_system = in.readInt() == 0;

        created_by = in.readParcelable(User.class.getClassLoader());
        persmissions = in.readParcelable(Permissions.class.getClassLoader());
        embed = in.readParcelable(Embed.class.getClassLoader());
        tokens = in.readParcelable(Tokens.class.getClassLoader();
    }   

    public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() {

        public Message createFromParcel(Parcel in) {
            return new Message(in);
        }

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



    /** Getters and setters, I'll spare you these **/

 }

Y este es el error que recibo:

Excepción fatal: principal java.lang.runtimeException: No se puede iniciar la actividad ComponentInfo {com.example.incentive/com.example.incentive.comments}: java.lang.classcastexception: android.os.parcelable [] no puede ser lanzado a com. ejemplo.incentive.messagemodel.tokens [] en android.app.activityThread.performlaunchActivity (ActivityThread.Java:1967) en android.app.activityThread.handlelaunchActivity (ActivityThread.Java:1992) en android.app.activityThread.Access $ 600 (ActivityThreadThreadthReadThreadthReadThread .java: 127) en android.app.activityThread $ h.handlemessage (ActivityThread.java:1158) en android.os.handler.dispatchMessage (handler.java:99) en android.os.looper.loop (Looper.Java: 137) en android.app.activityThread.main (activitythread.java:4441) en java.lang.reflect.method.invokenative (método nativo) en java.lang.reflect.method.invoke (método.java:511) en com .android.internal.os.zygoteinit $ metodandargscaller.run (zygoteinit.java:784) en com.android.internal.os.zygoteinit.main (zygoteinit.java:551) en dalvik.system.nativestart.main (Método nativo) causado por: java.lang.classcastexception: android.os.parcelable [] no puede ser lanzado a com.example.incentive.messagemodel.tokens [] en com.example.incentive.messagemodel.message.readfromparcel (mensaje. Java: 94) en com.example.incentive.messageModel.message. (Message.java:35) en com.example.incentive.messagemodel.message $ 1.CreateFromparcel (Message.Java:100) en com.example.incentive.messagemodel .Message $ 1.CreateFromparcel (Message.java:1) en android.os.parcel.readparcelable (parcel.java:1992) en android.os.parcel.readvalue (parcel.java:1854) en android.os.parcel.readmapinternalal (Parcel.java:2094) en android.os.bundle.unparcel (Bundle.java:223) en android.os.bundle.getparcelable (bundle.java:1158) en com.example.incentive.comments.oncreate (comentarios. Java: 67) en Android.app.activity.performCreate (Activity.Java:4465) en android.app.instrumentation.CallactivityonCreate (Instrumentation.Java:1049) en Android.app.activityThread.performlaunchactivity (ActivityThread.Java:1931). .. 11 más

Estoy pensando que el relevante ahora es:

Causado por: java.lang.classcastException: android.os.parcelable [] no puede ser lanzado a com.example.incentive.messagemodel.tokens [] en com.example.incentive.messagemodel.message.readfromparcel (Message.Java:94)

Así que probablemente estoy haciendo esto mal: tokens = in.readParcelable (tokens.class.getClassLoader ();

Aquí está mi clase de tokens:

import android.os.Parcel;
import android.os.Parcelable;

public class Tokens implements Parcelable {

    String type;
    String value;
    int start;
    int end;


    /** Parcelable related **/
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(type);
        dest.writeString(value);
        dest.writeInt(start);
        dest.writeInt(end);
    }

    private Tokens(Parcel in) {
        type = in.readString();
        value = in.readString();
        start = in.readInt();
        end = in.readInt();
    }

    public static final Parcelable.Creator<Tokens> CREATOR = new Parcelable.Creator<Tokens>() {

        public Tokens createFromParcel(Parcel in) {
            return new Tokens(in);
        }

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


    /** Getters and setters **/ 
}

He buscado toda la tarde y no puedo ver cómo hacerlo correctamente. ¿Alguien sabe?

¿Fue útil?

Solución

Use WriteTyPedArray y ReadtyPedArray para leer y escribir su matriz en el paquete

Leer

tokens = in.createTypedArray(Tokens.CREATOR);

Escribe

in.writeTypedArray(tokens, flags);

Otros consejos

prueba esto...

reemplazar

 tokens = in.readParcelable(Tokens.class.getClassLoader();

con

 tokens = in.readParcelableArray(Tokens.class.getClassLoader());

Estás escribiendo una matriz Parcelable pero leyéndola como parcelable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top