我正在尝试实现Parcelable而不是Serializble,因为它应该更高效.从我的MainActivity我想将Message对象传递给另一个activity,我的类Message包含其他类.如果我越过这一个错误,我确信我会遇到更多的错误,但是现在当我尝试运行我的应用程序时,我得到了
这是我的Message-class:
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; ArrayListattachments; 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 CREATOR = new Parcelable.Creator () { 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 **/ }
这是我得到的错误:
致命异常:主要了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.incentive/com.example.incentive.Comments}:java.lang.ClassCastException:android.os.Parcelable []不能被转换到COM. android.app.A活动时,我会在android.app.A活动时看到android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)的android.app.A活动时,我会在Android.app.ActivityThread.access $ 600(ActivityThread)上运行android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)的.java:127)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1158)在android.os.Handler.dispatchMessage(Handler.java:99)在android.os.Looper.loop(Looper.java: 137)在android.app.ActivityThread.main(ActivityThread.java:4441)在java.lang.reflect.Method.invokeNative(本机方法)在java.lang.reflect.Method.invoke(Method.java:511)在玉米位于dalvik.system.NativeStart.main的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)中的.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)(本机方法)引起:java.lang.ClassCastException:android.os.Parcelable []无法在com.example.incentive.messagemodel.Message.readFromParcel(消息.)中强制转换为com.example.incentive.messagemodel.Tokens []. java:94)com.example.incentive.messagemodel.Messl.(Message.java:35)com.example.incentive.messagemodel.Message $ 1.createFromParcel(Message.java:100)at com.example.incentive.messagemodel .Message $ 1.createFromParcel(Message.java:1)在android.os.Parcel.readParcelable(Parcel.java:1992)在android.os.Parcel.readValue(Parcel.java:1854)在android.os.Parcel.readMapInternal (Parcel.java:2094)在android.os.Bundle.unparcel(Bundle.java:223)在android.os.Bundle.getParcelable(Bundle.java:1158)在com.example.incentive.Comments.onCreate(评论. java:67)在android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1049)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)的android.app.Activity.performCreate(Activity.java:4465). ..还有11个
我现在认为相关的是:
引起:java.lang.ClassCastException:android.os.Parcelable []无法在com.example.incentive.messagemodel.Message.readFromParcel(Message.java:94)中强制转换为com.example.incentive.messagemodel.Tokens []
所以我可能做错了一件事: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.CreatorCREATOR = new Parcelable.Creator () { public Tokens createFromParcel(Parcel in) { return new Tokens(in); } public Tokens[] newArray(int size) { return new Tokens[size]; } }; /** Getters and setters **/ }
我整个下午都在搜索,我看不清楚如何正确地做到这一点.有人知道吗?
使用writeTypedArray和readTypedArray读取和写入数组到parcel
读
tokens = in.createTypedArray(Tokens.CREATOR);
写
in.writeTypedArray(tokens, flags);