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];
        }
    };
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章