Frage

Ich versuche, parzelable statt serializble zu implementieren, da es effizienter sein soll. Aus meiner Mainaktivität möchte ich ein Nachrichtenobjekt an eine andere Aktivität übergeben, meine Klasselemeldung enthält andere Klassen. Wenn ich an diesem einen Fehler vorbeikomme, bin ich sicher, dass ich viel mehr von ihnen renne, aber im Moment, wenn ich versuche, meine App auszuführen, bekomme ich

Dies ist meine Nachrichtenklasse:

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

 }

Und das ist der Fehler, den ich bekomme:

Fatale Ausnahme: Haupt java.lang.runtimeexception: Aktivitätskomponentinfo kann nicht starten. Beispiel. .java: 127) at android.app.Activity thread $ h.handlemessage (activityThread.java:1158) at android.os.handler.dispatchMessage (Handler.java:99) at Android.os.looper.loop (Looper.java:: 137) at android.app.ActivityThread.main (ActivityThread.java:4441) unter java.lang.reflect.method.invokenative (native Methode) unter java.lang.reflect.method.invoke (methode.java:511) in com Comet .Android.internal.os.zygoteinit $ methodandAndargscaller.run (Zygoteinit.java:784) bei com.android.internal.os.zygoteinit.main (Zygoteinit.java:551) at Dalvik.System.nativestart.Main (Native Methode) verursacht durch: java.lang.classcastexception: android.os.Parcelable [] kann nicht auf com.example.incentive.messagemodel.tokens [] gegossen werden. Java: 94) bei com.example.incentive.messagemodel.message. (Message.java:35) unter com.example.incentive.messAgemodel.Message $ 1.createfromparcel (Message.java:100) unter com.example.incentive.messagemodelcel ( .Message $ 1.createfromparcel (message.java:1) at android.os.parcel.readParcelable (parcel.java:1992) at android.os.parcel.readvalue (Parcel.java:1854) unter Android.os.os.s.readmapinternalal (Parcel.java:2094) at android.os.bundle.unparcel (bündel.java:223) at android.os.bundle.getParcelable (bündel.java:1158) at com.example.incentive.oncreate (Kommentare. Java: 67) at Android.app.Activity.Performcreate (Aktivität.Java:4465) at Android.app.instrumentation.Callactivityoncreate (Instrumentation .. 11 mehr

Ich denke, das relevante ist jetzt:

Verursacht durch: java.lang.classcastexception: android.os.Parcelable [] kann nicht auf com.example.incentive.messagemodel.tokens [] unter com.example.incentive.messagemodel.message.Readfromparcel gegossen werden (Message.java:94))

Also mache ich wahrscheinlich das falsch: tokens = in.readParcelable (tokens.class.getClassloader ();

Hier ist meine Token-Klasse:

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

Ich habe den ganzen Nachmittag gesucht und kann nicht sehen, wie man es richtig macht. Weiß jemand?

War es hilfreich?

Lösung

Verwenden Sie WriteTypedArray und ReadyPedarray, um Ihr Array in das Paket zu lesen und zu schreiben

Lesen

tokens = in.createTypedArray(Tokens.CREATOR);

Schreiben

in.writeTypedArray(tokens, flags);

Andere Tipps

Versuche dies...

ersetzen

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

mit

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

Sie schreiben ein Parzellabstand, lesen es aber als paketbar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top