關於通過Parcelable協議傳遞資料時出現郵包錯誤,parcelable郵包
最近第一次使用到Intent傳遞自訂對象資料的Parcelable方式,先說一下Parcelable的實現方式吧
Parcelable的實現原理首先是將一個完整的對象進行分解,分解後的每一部分都是Intent所支援的一個類型,這樣也就實現傳遞對象的功能了。
Parcelable需要實現三個東西:
1) describeContents方法,這個方法直接返回0就可以了;
2) writeToParcel方法,這個方法調用Parcel的writeXXX()方法將類的資料寫入外部提供的Parcel中;
3) 提供一個靜態CREATOR常量實現Parcelable.Creator介面,這個介面要重寫兩個方法,newArray(int size)只需要new出一個該自訂對象的數組,並使用方法中傳入的size作為數組大小返回就可以了;而createFromParcel(Parcel in)方法中我們要實現從in中都去出剛才寫出的資料的功能;
Android範例程式碼:
/** * 媒體實體類 */public class Media implements Parcelable { private String name; private String uri; private String singer; private String id; private int duration; private int album_id; private String key; public Media() { } …… …… @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(uri); dest.writeString(singer); dest.writeString(id); dest.writeInt(duration); dest.writeInt(album_id); dest.writeString(key); } public static final Parcelable.Creator<Media> CREATOR = new Creator<Media>() { @Override public Media[] newArray(int size) { return new Media[size]; } @Override public Media createFromParcel(Parcel in) { return new Media(in); } }; public Media(Parcel in) { name = in.readString(); uri = in.readString(); singer = in.readString(); id = in.readString(); duration = in.readInt(); album_id = in.readInt(); key = in.readString(); }}
而在我實際開發過程中,在擷取資料時系統報出了java.lang.RuntimeException: Parcel android.os.Parcel@4aa21e7c: Unmarshalling unknown type code 77 at offset 328的郵包錯誤,最開始以為是哪裡忘寫了,查了一堆資料還是沒能解決。
後面仔細看了下才發現在開發的時候我在public Media createFromParcel(Parcel in)中調用public Media(Parcel in)取出資料時將duration = in.readInt()和album_id = in.readInt();的順序寫反了,改過來就沒錯了,根本原因就是分解跟取出來的時候順序一定要一樣,謹記!