爱程序网

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

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助