classcastException عند محاولة القيام resplarcelable على صفيف الكائن المخصص

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

سؤال

أحاول تنفيذ الطرود بدلاً من Serializble لأنه من المفترض أن يكون أكثر كفاءة. من النشاط الرئيسي ، أريد نقل كائن رسالة إلى نشاط آخر ، تحتوي رسالة الفصل على فئات أخرى. إذا تجاوزت هذا الخطأ الواحد ، فأنا متأكد من أنني سأركض أكثر منهم ، لكن الآن عندما أحاول تشغيل تطبيقي ، أحصل على

هذه فئة الرسائل الخاصة بي:

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

 }

وهذا هو الخطأ الذي أحصل عليه:

استثناء فادح: main java.lang.runtimeexception: غير قادر على بدء تشغيل ComponentInfo {com.example.incentive/com.example.incentive.comments}: java.lang.classcastexception: Android.Os.Parcelable [] لا يمكن إلقاؤه إلى com. مثال. .java: 127) في Android.App.ActivityTheread $ H.HandleMessage (Activitythread.java:1158) at Android.Os.Handler.DispatchMessage (Handler.Java:99) في Android.Os.Looper.loop (looper.java: 137) في Android.App.Activitythread.main (ActivityThread.java:441) في java.lang.reflect.method.invokenistial (الطريقة الأصلية) في java.lang.reflect.method.invoke (method.java:511) في com .android.internal.os.zygoteinit $ methodandargscaller.run (zygoteinit.java:784) في com.android.internal.os.zygoteinit.main (الطريقة الأصلية) الناتجة عن: java.lang.classcastexception: Android.Os.Parcelable [] لا يمكن إلقاؤها إلى com.inpyampl.incentive.messagemodel.tokens [] في com.example.incentive.messagemodel.message.readfromparcel (الرسالة. Java: 94) في com.example.incentive.messagemodel.message. .message $ 1.createfromparcel (message.java:1) at Android.Os.Parcel.ReadParcelable (parcel.java:1992) at Android.OS.Parcel.readvalue (parcel.java:1854) at Android.Os.Parcel.readmapinternal (Parcel.java:2094) في Android.Os.Bundle.unparcel (bundle.java:23) في Android.Os.Bundle.getParcelable (bundle.java:1158) على com.example.incentive.oncreate (تعليقات. Java: 67) في Android.App.activity.performCreate (Activity.java:4465) في Android.App.instrumentation.CallActivityOncreate (Instrumentation.java:1049) في Android.App.ActivitythRead.performLaunchActivity (Activitythread.java:1931). .. 11 أكثر

أفكر في أن الشخص ذي الصلة الآن هو:

بسبب: java.lang.classcastexception: Android.os.Parcelable [] لا يمكن إلقاؤه إلى com.example.incentive.messagemodel.tokens [] في com.example.incentive.messagemodel.message.readfromparcel (message.java:94)

لذلك ربما أفعل هذا خطأ: الرموز = in.ReadParcelable (Tokens.class.getClassLoader () ؛

إليكم فئة الرموز الخاصة بي:

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

لقد بحثت طوال فترة ما بعد الظهر ولا أستطيع أن أجد كيفية القيام بذلك بشكل صحيح. هل يعلم أحد؟

هل كانت مفيدة؟

المحلول

استخدم WriteTypedArray و evertypledarray لقراءة وصفيفك إلى الطرود

اقرأ

tokens = in.createTypedArray(Tokens.CREATOR);

يكتب

in.writeTypedArray(tokens, flags);

نصائح أخرى

جرب هذا...

يحل محل

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

مع

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

أنت تكتب مجموعة قابلة للطرد ولكن قراءتها قابلة للطرد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top