Pergunta

Estou tentando implementar o Parcelable, em vez de serializando, pois deveria ser mais eficiente. Da minha atividade principal, quero passar um objeto de mensagem para outra atividade, minha mensagem de classe contém outras classes. Se eu superar esse erro, tenho certeza de

Esta é a minha classe de mensagem:

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

 }

E este é o erro que estou recebendo:

Exceção fatal: Java principal.lang.RuntimeException: Incapaz de iniciar o componente de atividade {com.example.incentive/com.example.incentive.comments}: java.lang.classCastException: android.os.parcelable [] não pode ser fundido para co. exemplo.incentive.MessageModel.tokens [] em android.app.activitythread.performlaunchactivity (ativityThread.java:1967) em android.app.activitythread.haplanchactivity (atividade de atives.java:1992) atndroid.app.atividade.activity.actThEn.actThread.Java: .java: 127) em android.app.activityThread $ h.handleMessage (ativityThread.java:1158) em android.os.handler.dispatchmessage (handler.java:99) em android.os.looper.loop (looper.java: 137) em android.app.activityThread.main (atividadethread.java:4441) em java.lang.reflect.method.inVokenative (método nativo) em java.lang.reflect.method.invoke (métod.java:511) em com .android.internal.os.zygoteinit $ MethodandArgScaller.run (zygoteinit.java:784) em com.android.internal.os.zygoteinit.main (zygoteinit.java:551) em dalvik.system.nativart.main (Método nativo) causado por: java.lang.classCastException: android.os.parcelable [] não pode ser fundido para com.example.incentive.MessageModel.tokens [] em com.example.incentive.MessageModel.Message.readFromparcel (mensagem. java: 94) em com.example.incentive.MessageModel.Message. (Message.Java:35) em com.example.incentive.MessageModel.Message $ 1.CreateFromParcel (message.java:100) em com.example.incentive.messageModel .Message $ 1.CreateFromParcel (message.java:1) em android.os.parcel.readparcelable (parcel.java:1992) em android.os.parcel.readvalue (parcel.java:1854) em android.os.oscel.readmapinnald. (Parcel.java:2094) em android.os.bundle.unparcel (putcle.java:223) em android.os.bundle.getparcelable (bundle.java:1158) em com.example.incentive.comments.oncreate (comentários. java: 67) em android.app.activity.performCreate (ativity.java:4465) em android.app.instrumentation.calatividadenecreate (instrumentação.java:1049) em android.apptivitythread.performLanchactivity (atividadethread.java:1931). .. 11 mais

Estou pensando que o relevante agora é:

Causado por: java.lang.classCastException: Android.os.parcelable [] não pode ser fundido para com.example.incentive.messageModel.tokens [] em com.example.incentive.messageModel.message.readfromparcel (message.java:94)

Então, provavelmente estou fazendo isso errado: tokens = in.readparcelable (tokens.class.getclassloader ();

Aqui está minha classe 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 **/ 
}

Eu procurei a tarde toda e não consigo ver como fazê -lo corretamente. Alguém sabe?

Foi útil?

Solução

Use WritetyPedArray e ReadtypedArray para ler e escrever sua matriz para o pacote

Ler

tokens = in.createTypedArray(Tokens.CREATOR);

Escreva

in.writeTypedArray(tokens, flags);

Outras dicas

Experimente isso ...

substituir

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

com

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

Você está escrevendo uma matriz parcelável, mas lendo -a como parcelável

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top