ClassCastException lorsque vous essayez de faire ReadArcelable sur un tableau d'objets personnalisé

StackOverflow https://stackoverflow.com/questions/20353585

Question

J'essaie d'implémenter la parcelle au lieu de Serializble car elle est censée être plus efficace. De ma mainactivité, je veux transmettre un objet de message à une autre activité, mon message de classe contient d'autres classes. Si je passe cette erreur, je suis sûr que je vais en courir beaucoup plus, mais en ce moment, quand j'essaierai d'exécuter mon application, je reçois

Ceci est ma classe de messages:

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 **/

 }

Et c'est l'erreur que j'obtiens:

Exception fatale: Main java.lang.runtimeException: Impossible de démarrer l'activité ComponentInfo {com.example.incentive / com.example.incentive.comments}: java.lang.classcastException: Android.os.Parcelable [] ne peut pas être jeté à com. Exemple.incentive.messageModel.tokens [] sur android.app.activitythread.performlaunchActivity (activitythread.java:1967) sur android.app.activitythread.handlelAnchActivity (activitythread.java:1992) sur android.app.activeThread.Access 600 $ (ActivityThread .java: 127) sur Android.App.ActivityThread $ H.HandleMessage (ActivityThread.java:1158) sur android.os.handler.dispatchMessage (handler.java:99) sur Android.os.looper.loop (Looper.java: 137) sur android.app.activitythread.main (activitythread.java:4441) sur java.lang.reflect.method.invokenative (méthode native) sur java.lang.reflect.method.invoke (méthode.java:511) à com .android.internal.os.zygoteinit $ methodandargscaller.run (zygoteinit.java:784) sur com.android.internal.os.zygoteinit.main (zygoteinit.java:551) à dalvik.system.nativestart.main (Méthode native) Causées par: java.lang.classCastException: Android.os.Parcelable [] ne peut pas être jeté sur com.example.incentive.messageModel.tokens [] sur com.example.incentive.messagemodel.message.readfrombParcel (message. java: 94) sur com.example.incentive.messagemodel.message. (message.java:35) sur com.example.incentive.messagemodel.mesage 1,CreateFrombcel (message.java:100) sur com.example.incentive.MessageModelodelOndel .Message 1 $ CreateFrombcel (message.java:1) sur android.os.parcel.readParcelable (Parcel.java:1992) sur Android.os.Parcel.readvalue (Parcel.java:1854) sur Android.os.Parcel.readmapinternal (Parcel.java:2094) sur android.os.bundle.unparcel (bundle.java:223) sur android.os.bundle.getParcelable (bundle.java:1158) sur com.example.incentive.comments.oncreate (commentaires. java: 67) sur android.app.activity.performcreate (activité.java:4465) sur android.app.instrumentation.callactivityoncreate (instrumentation.java:1049) à Android.App.activitythread.performlaunchActivity (Activitythread.java:1931). .. 11 de plus

Je pense que le pertinent est maintenant:

Causé par: java.lang.classCastException: android.os.Parcelable [] ne peut pas être jeté sur com.example.incentive.messagemodel.tokens [] sur com.example.incentive.messagemodel.message.readfrombcel (message.java:94)

Donc je fais probablement celle-ci mal: tokens = in.readParcelable (tokens.class.getClassloader ();

Voici ma classe de jetons:

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 **/ 
}

J'ai cherché tout l'après-midi et je ne vois pas comment le faire correctement. Est-ce que quelqu'un sait?

Était-ce utile?

La solution

Utilisez WriteTyPedArray et ReadTypedArray pour lire et écrire votre tableau sur le colis

Lis

tokens = in.createTypedArray(Tokens.CREATOR);

Écrire

in.writeTypedArray(tokens, flags);

Autres conseils

essaye ça...

remplacer

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

avec

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

Vous écrivez un tableau parcelable mais le lisez comme parcelable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top