Usa WriteTypedArray e ReadtypedArray per leggere e scrivere il tuo array al pacco
Leggi
tokens = in.createTypedArray(Tokens.CREATOR);
Scrivere
in.writeTypedArray(tokens, flags);
Domanda
Sto cercando di implementare parchelable invece di serializble in quanto dovrebbe essere più efficiente. Dalla mia mainttività voglio passare un oggetto messaggio a un'altra attività, il mio messaggio di classe contiene altre classi. Se superano questo errore, sono sicuro che mi imbatterò molto di più, ma proprio ora quando provo a eseguire la mia app, sto ricevendo
Questa è la mia classe di messaggi:
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 questo è l'errore che sto ricevendo:
Eccezione fatale: main java.lang.runtimeexception: impossibile avviare attività componentInfo {com.example.incentive/com.example.incentive.comments}: java.lang.classcastException: Android.os.Parcelable [] non può essere lanciato a com. Esempio.Incentive.MessageModel.tokens [] su Android.App.ActivityThread.PerformLaunchactivity (ActivityThread.java:1967) su Android.App.ActityThread.Handlelaunchactivity (ActivityThread.java:1992) a Android.App. .java: 127) su Android.App.ActivityThread $ H.HandleMessage (ActivityThread.java:1158) su Android.os.Handler.dispatchMessage (Handler.java:99) su Android.Ooper.Loop (Looper.java: 137) su Android.App.ActivityThread.main (ActivityThread.java:4441) su java.lang.reflect.method.invokentive (metodo nativo) su java.lang.reflect.method.invoke (Method.java:511) a Com .android.internal.os.zyGoteInt $ MethodAndargScaller.run (ZyGoteInit.java:784) su com.android.internal.os.zygoteinit.main (zygoteinit.java:551) su Dalvik.system.nativeSt.main (Metodo nativo) causato da: java.lang.classcastException: android.os.parcelable [] non può essere lanciato su com.example.incentive.messagemodel.tokens [] at com.example.incentive.messagemodel.message.readfromparcel (messaggio. java: 94) at com.example.incentive.messagemodel.message. (Message.java:35) su com.example.incentive.messagemodel.Message $ 1.CreateFromParcel (Message.java:100) su com.example.incentive.messagemodel .Message $ 1.CreateFromparcel (message.java:1) su android.os.parcel.readparcelable (parcel.java:1992) su android.os.parcel.readValue (parcel.java:1854) su Android.os.parcel.readmapinternalal ) Java: 67) su Android.App.Activity.PerformCreate (Activity.java:4465) su Android.App.Istrumentation.CalActivityonCreate (Instrumentation.java:1049) su Android.App.ActityThread.PerformLaunchactivity (ActivityThread.java:1931). .. 11 Altri
Sto pensando che quello rilevante ora sia:
Causato da: java.lang.classcastException: android.os.parcelable [] non può essere lanciato a com.example.incentive.messagemodel.tokens [] su com.example.incentive.messagemodel.message.readfromparcel (message.java:94)
Quindi probabilmente sto facendo questo sbagliato: token = in.ReadParcelable (token.class.getClassloader ();
Ecco la mia classe di token:
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 **/
}
Ho cercato tutto il pomeriggio e non riesco a vedere come farlo correttamente. Qualcuno sa?
Soluzione
Usa WriteTypedArray e ReadtypedArray per leggere e scrivere il tuo array al pacco
Leggi
tokens = in.createTypedArray(Tokens.CREATOR);
Scrivere
in.writeTypedArray(tokens, flags);
Altri suggerimenti
prova questo...
sostituire
tokens = in.readParcelable(Tokens.class.getClassLoader();
insieme a
tokens = in.readParcelableArray(Tokens.class.getClassLoader());
Stai scrivendo un array parchelabile ma lo leggi come parchelabile