你的位置:首页 > Java教程

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