문제

나는 더 효율적이기 때문에 Serializble 대신에 소포 가능한 구현을 시도하고 있습니다. Mainactivity에서 메시지 개체를 다른 활동으로 전달하고 싶습니다. 내 클래스 메시지에는 다른 클래스가 포함되어 있습니다. 이 오류를 지나면 더 많은 오류가있을 것이라고 확신하지만 지금은 앱을 실행하려고 할 때

이것은 내 메시지 클래스입니다.

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에 캐스트 할 수 없습니다. example.incentive.messagemodel.tokens [] at Android.app.act.Act.PormlaunchActivity (ActivityThread.java:1967)의 Android.app.Act.Act. activityThread.HandlElaunchActivity (ActivityThread.java:1992)의 Android.Act.Act.Accesss $ 600 .java : 127) Android.app.Act. Act. Act.Act. android.handler.dispatchmessage (handler.java:99)에서 Android.handler.loop.loop (looper.java : Java : Java : Java : Java : Java : 137) android.app.ActivityThread.Main (ActivityThread.java:4441)에서 java.lang.reflect.method.invokenative (java.lang.reflect.method.invoke)에서 COM에서 VOKENATIVE (기본 메소드) com.android.internal.os.zygoteinit.main (zygoteinit.java:551)의 com.Android.system.systeM.nativestart.main (기본 메소드)에 의한 : java.lang.classcastexception : android.os.parcelable []는 com.example.incentive.messagemodel.tokens []에서 com.example.incentive.messagemodel.message.ReadFromparcel (메시지. java : 94)에서 com.example.incentive.messagemodel.message. .Message $ 1. android.os.sparcelable (parcel.java:1992)에서 Android.os.readvalue (parcel.java:1854)에서 Android.os.sprel.sprel.readmapinternalal (parcel.java:2094) Android.os.bundle.unparcel (bld.java:223)에서 android.os.bundle.getParcelable (blendle.java:1158)의 com.example.incentive.comments.oncreate (주석. android.app.activity.performcreate (activity.java:4465)의 Java : 67) 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)에 캐스트 할 수 없습니다.

그래서 나는 이것을 잘못하고있을 것입니다 : tokens = 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 및 ReadtyPedArray를 사용하여 배열을 읽고 쓰기를 읽고 씁니다.

읽다

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