Android在開發(fā)中的實用技巧之Parcelable的使用以及如何傳遞復(fù)雜的數(shù)據(jù)類型

根據(jù)已上線的app里總結(jié)出來的實用小技巧

Parcelable的使用以及如何傳遞復(fù)雜的數(shù)據(jù)類型

1、Understand

ParcelableAndroid的使用基本是必不可少的
最常用的莫過于啟動Activity時傳遞數(shù)據(jù)時使用了
其實除了Parcelable還可以使用Serializable
后者是javaApi中自帶的一個接口, 用于保存對象本地文件時使用(俗稱序列化),
當(dāng)然在Android中雖然也可以使用, 但不推薦使用

  • 優(yōu)點:

    • Parcelable相比Serializable效率和性能都要高上不少
    • 支持Intent數(shù)據(jù)傳遞,也支持進(jìn)程間通信
  • 缺點:

    • Parcelable用法要比Serializable復(fù)雜

</br></br>

2、Example

MainBean.class
public class MainBean implements Parcelable {
    private int id;
    private boolean normalStatus;
    private long gmtCreated;
    private String name;
    private BigDecimal price;
    private SecondBean secondBean;
    private List<SecondBean> secondBeanList;
    private int[] numberArray;

    public MainBean () {

    }

    //固定寫法, 只用修改Creator的泛型
    public static Creator<MainBean> getCREATOR() {
        return CREATOR;
    }

    //固定寫法, 只用修改Creator的泛型
    public static final Creator<MainBean> CREATOR = new Creator<MainBean>() {
        @Override
        public MainBean createFromParcel(Parcel in) {
            return new MainBean(in);
        }

        @Override
        public MainBean[] newArray(int size) {
            return new MainBean[size];
        }
    };

    @Override
    public int describeContents() {
        //固定寫法
        return 0;
    }

    protected MainBean(Parcel in) {
        //單獨寫了一個readFromParcel和writeToParcel對應(yīng), 便于理解
        readFromParcel(in);
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
       //切記非常重要, 寫數(shù)據(jù)(out.write...)和下面的讀數(shù)據(jù)(in.read...)的順序一定要和聲明的屬性順序?qū)?yīng)上, 不然會因為讀寫的數(shù)據(jù)類型不一致而報異常

        //普通數(shù)據(jù)類型int, double, String等等, 用法以此類推
        out.writeInt(id);
        //由于沒有寫入布爾數(shù)據(jù)類型的方法, 需要把布爾數(shù)據(jù)類型轉(zhuǎn)換為String
        out.writeString(String.valueOf(normalStatus));
        out.writeLong(gmtCreated);
        out.writeString(name);
        //判空, 因為如果price為null, 也會報異常, 沒有寫入BigDecimal的數(shù)據(jù)類型, 需要轉(zhuǎn)為String
        out.writeString(price == null ? "0" : price.toString());
        #//寫入對象, 該對象必須也要實現(xiàn)Parcelable接口
        out.writeParcelable(secondBean, flags);
        //寫入List集合
        out.writeList(secondBeanList);
        //寫入int類型數(shù)組, 其他的數(shù)組類型以此類推
        out.writeIntArray(numberArray);
    }

    private void readFromParcel(Parcel in) {
        #//順序一定要對應(yīng)上
        id = in.readInt();
        //讀取的String轉(zhuǎn)為布爾類型
        normalStatus = Boolean.valueOf(in.readString());
        gmtCreated = in.readLong();
        name = in.readString();
        //讀取的price為String類型, 需要轉(zhuǎn)為BigDecimal
        price = new BigDecimal(in.readString());
        //讀取對象實現(xiàn)了Parcelable接口的對象
        secondBean = in.readParcelable(SecondBean.class.getClassLoader());
        //讀取實現(xiàn)了Parcelable接口的對象List
        secondBeanList = in.readArrayList(SecondBean.class.getClassLoader());
        //創(chuàng)建(讀取)int類型數(shù)組, 其他數(shù)組類型以此類推
        numberArray = in.createIntArray();
    }

    setMethod()...
    getMethod()...
SecondBean.class
public class SecondBean implements Parcelable {
    private int id;

    public SecondBean() {
    }

    public SecondBean(int id){
        this.id = id;
    }

    protected SecondBean(Parcel in) {
        id = in.readInt();
    }

    public static final Creator<SecondBean> CREATOR = new Creator<SecondBean>() {
        @Override
        public SecondBean createFromParcel(Parcel in) {
            return new SecondBean(in);
        }

        @Override
        public SecondBean[] newArray(int size) {
            return new SecondBean[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flag) {
        out.writeInt(id);
    }

    public static Creator<SecondBean> getCREATOR() {
        return CREATOR;
    }

    setMethod()...
    getMethod()...
}

在Activity中使用

  • MainActivity.class
            MainBean mainBean = new MainBean();
            .......
            Intent intent = new Intent(this, SecondActivity.class);
            intent.putExtra("data", mainBean);
            startActivity(intent);
  • SecondActivity.class
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            MainBean mainBean = bundle.getParcelable("data");
        }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評論 25 708
  • 1.什么是Activity?問的不太多,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activit...
    JoonyLee閱讀 5,871評論 2 51
  • 各位,在你們的身邊,爺爺、奶奶、外公、外婆的這四位,至今仍尚在人世的還剩幾位呢?我的身邊到今年(2016年)為止一...
    溫莉2016閱讀 335評論 1 1
  • (1) 記得幾前年看電視訪談節(jié)目,最喜歡的一位女演員嫁人了,當(dāng)主持人問她,為什么會選擇某人做她的老公時,她一臉幸福...
    代連華閱讀 2,496評論 0 1
  • 中午第一更,順便說一下我是小學(xué)生?。 “呲呲嘶”“喂,可以聽到嗎36小組?”“可以?!碧器肫届o的回答道?!巴郏『谜?..
    小真dada閱讀 227評論 0 0

友情鏈接更多精彩內(nèi)容