最近第一次使用到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();的顺序写反了,改过来就没错了,根本原因就是分解跟取出来的时候顺序一定要一样,谨记!