parcelable接口实现

Parcelable接口

想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒。但是android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择。 
使用Parcelable3个步骤: 
1.实现Parcelable接口 
2.实现接口中的两个方法

public int describeContents();
public void writeToParcel(Parcel dest, int flags);
  • 1
  • 2

第一个方法是内容接口描述,默认返回0就可以了 
第二个方法是将我们的对象序列化一个Parcel对象,也就是将我们的对象存入Parcel中 
3.实例化静态内部对象CREATOR实现接口Parcelable.Creator,实例化CREATOR时要实现其中的两个方法,其中createFromParcel的功能就是从Parcel中读取我们的对象。

也就是说我们先利用writeToParcel方法写入对象,再利用createFromParcel方法读取对象,因此这两个方法中的读写顺序必须一致,否则会出现数据紊乱,一会我会举例子。 
看一个代码示例:

public class Person implements Parcelable{

    private String username;
    private String nickname;
    private int age;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String username, String nickname, int age) {
        super();
        this.username = username;
        this.nickname = nickname;
        this.age = age;
    }
    public Person() {
        super();
    }
    /**
     * 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中
     * 写的顺序一致,否则数据会有差错,比如你的读取顺序如果是:
     * nickname = source.readString();
     * username=source.readString();
     * age = source.readInt();
     * 即调换了username和nickname的读取顺序,那么你会发现你拿到的username是nickname的数据,
     * 而你拿到的nickname是username的数据
     * @param source
     */
    public Person(Parcel source) {
        username = source.readString();
        nickname=source.readString();
        age = source.readInt();
    }
    /**
     * 这里默认返回0即可
     */
    @Override
    public int describeContents() {
        return 0;
    }
    /**
     * 把值写入包     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(username);
        dest.writeString(nickname);
        dest.writeInt(age);
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {

        /**
         * 供外部类反序列化本类数组使用
         */
        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }

        /**
         * 从包(parcel)中读取数据         *注意顺序一定是name,nickName,age。否则必然出错
         */
        @Override
        public Person createFromParcel(Parcel source) {
            String name = source.readString();            String nickName = source.readString();            String age = source.readInt();            return new Person(name,nickName,age);
        }
    };
}

猜你喜欢

转载自blog.csdn.net/cdaimadada/article/details/80663018