Android使用Parcelable注意事项

想要在两个activity之间使用Intent传递对象,此时被传递对象就必须序列化,在android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就OK了,无痕介入。此外android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择。

下面记录下使用Parcelable的注意事项:

使用Parcelable步骤:
1.实现Parcelable接口
2.实现接口中的两个方法

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

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

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

public class LocationBean implements Parcelable {
    //经纬度
    private double longitude;
    private double latitude;
    //附近poi名(例:广发银行(海淀支行))
    private String placeName = "";
    //详细地址(例如:北京市海淀区海淀大街48号靠近广发银行(海淀支行))
    private String address = "";
    //所在国家(例:中国)
    private String country = "";
    // 省份
    private String province = "";
    //所在城市(例:北京市)
    private String city = "";
    // 城市编码
    private String cityCode = "";
    //所在区域(例:海淀区)
    private String district = "";
    // 区域编码
    private String districtCode = "";
    //街道(例:海淀大街)
    private String streetName = "";
    //街道门牌号码(例:48号)
    private String streetNum = "";

    public LocationBean() {
    }

    /**
     * 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中
     * 写的顺序一致,否则数据会有差错,比如你的读取顺序如果是:
     * placeName = source.readString();
     * address=source.readString();
     * 即调换了placeName和address的读取顺序,那么你会发现你拿到的placeName是address的数据,
     * 而你拿到的address是placeName的数据
     *
     * @param in
     */
    protected LocationBean(Parcel in) {
        longitude = in.readDouble();
        latitude = in.readDouble();
        placeName = in.readString();
        address = in.readString();
        country = in.readString();
        province = in.readString();
        city = in.readString();
        cityCode = in.readString();
        district = in.readString();
        districtCode = in.readString();
        streetName = in.readString();
        streetNum = in.readString();
    }


    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeDouble(longitude);
        dest.writeDouble(latitude);
        dest.writeString(placeName);
        dest.writeString(address);
        dest.writeString(country);
        dest.writeString(province);
        dest.writeString(city);
        dest.writeString(cityCode);
        dest.writeString(district);
        dest.writeString(districtCode);
        dest.writeString(streetName);
        dest.writeString(streetNum);
    }

    public static final Creator<LocationBean> CREATOR = new Creator<LocationBean>() {
        /**
         * 从Parcel中读取数据
         */
        @Override
        public LocationBean createFromParcel(Parcel in) {
            return new LocationBean(in);
        }

        /**
         * 供外部类反序列化本类数组使用
         */
        @Override
        public LocationBean[] newArray(int size) {
            return new LocationBean[size];
        }
    };
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值