2014-09-02 52 views
1

我試圖將自定義類實現爲parcelable,並且在從包中讀取/寫入這些類的列表時出現問題。我有3個課,測驗,問答。當讀取自定義類的列表時,解包未知類型代碼

這是給我一個錯誤的問題類下,上線:

in.readList(answers, Answer.class.getClassLoader()); 

這裏是我的班, 測驗:

public class Quiz implements Parcelable{ 
    private List<Question> questions; 

    public Quiz(Parcel in) { 
     questions = new ArrayList<Question>(); 
     in.readList(questions,Question.class.getClassLoader()); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeList(questions); 
    } 

    public static final Parcelable.Creator<Quiz> CREATOR = new Parcelable.Creator<Quiz>() { 

     public Quiz createFromParcel(Parcel in) { 
      return new Quiz(in); 
     } 

     public Quiz[] newArray(int size) { 
      return new Quiz[size]; 
     } 
    }; 
} 

問:

public class Question implements Parcelable { 

    private String question; 
    private List<Answer> answers; 

    public Question(Parcel in) { 
     answers = new ArrayList<Answer>(); 
     in.readList(answers, Answer.class.getClassLoader()); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(question); 
     parcel.writeList(answers); 
    } 

    public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() { 

     public Question createFromParcel(Parcel in) { 
      return new Question(in); 
     } 

     public Question[] newArray(int size) { 
      return new Question[size]; 
     } 
    }; 
} 

答案:

public class Answer implements Parcelable { 
    private String answer; 
    private boolean isCorrect = false; 

    public Answer(String answer) { 
     this.answer = answer; 
    } 

    public Answer(Parcel in) { 
     answer = in.readString(); 
     isCorrect = in.readByte() != 0; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(answer); 
     parcel.writeByte((byte) (isCorrect ? 1 : 0)); 
    } 
    public static final Parcelable.Creator<Answer> CREATOR = new Parcelable.Creator<Answer>() { 

     public Answer createFromParcel(Parcel in) { 
      return new Answer(in); 
     } 

     public Answer[] newArray(int size) { 
      return new Answer[size]; 
     } 
    }; 
} 

堆棧跟蹤:

09-03 01:03:43.018 20659-20659/auf.ccs.appschool E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{auf.ccs.appschool/auf.ccs.appschool.QuizActivity}: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 6815831 at offset 332 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
       at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
       at android.os.Handler.dispatchMessage(Handler.java:99) 
       at android.os.Looper.loop(Looper.java:130) 
       at android.app.ActivityThread.main(ActivityThread.java:3691) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:507) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
       at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 6815831 at offset 332 
       at android.os.Parcel.readValue(Parcel.java:1913) 
       at android.os.Parcel.readListInternal(Parcel.java:2092) 
       at android.os.Parcel.readList(Parcel.java:1414) 
       at auf.ccs.appschool.Items.Question.<init>(Question.java:25) 
       at auf.ccs.appschool.Items.Question$1.createFromParcel(Question.java:67) 
       at auf.ccs.appschool.Items.Question$1.createFromParcel(Question.java:64) 
       at android.os.Parcel.readParcelable(Parcel.java:1981) 
       at android.os.Parcel.readValue(Parcel.java:1846) 
       at android.os.Parcel.readListInternal(Parcel.java:2092) 
       at android.os.Parcel.readList(Parcel.java:1414) 
       at auf.ccs.appschool.Items.Quiz.<init>(Quiz.java:28) 
       at auf.ccs.appschool.Items.Quiz$1.createFromParcel(Quiz.java:44) 
       at auf.ccs.appschool.Items.Quiz$1.createFromParcel(Quiz.java:41) 
       at android.os.Parcel.readParcelable(Parcel.java:1981) 
       at auf.ccs.appschool.Items.Video.<init>(Video.java:113) 
       at auf.ccs.appschool.Items.Video$1.createFromParcel(Video.java:132) 
       at auf.ccs.appschool.Items.Video$1.createFromParcel(Video.java:130) 
       at android.os.Parcel.readParcelable(Parcel.java:1981) 
       at android.os.Parcel.readValue(Parcel.java:1846) 
       at android.os.Parcel.readMapInternal(Parcel.java:2083) 
       at android.os.Bundle.unparcel(Bundle.java:208) 
       at android.os.Bundle.getParcelable(Bundle.java:1100) 
       at auf.ccs.appschool.QuizActivity.onCreate(QuizActivity.java:40) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
                at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
                at android.os.Handler.dispatchMessage(Handler.java:99) 
                at android.os.Looper.loop(Looper.java:130) 
                at android.app.ActivityThread.main(ActivityThread.java:3691) 
                at java.lang.reflect.Method.invokeNative(Native Method) 

回答

1

在你Question類,你正在閱讀

answers = new ArrayList<Answer>(); 
in.readList(answers, Answer.class.getClassLoader()); 
從包裹

,但寫

parcel.writeString(question); 
parcel.writeList(answers); 

進去。小心地按同一順序寫入/讀取宗地中的相同值(類型)。

固定Question構造:

public Question(Parcel in) { 
    question = in.readString(); 
    answers = new ArrayList<Answer>(); 
    in.readList(answers, Answer.class.getClassLoader()); 
} 
相關問題