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

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

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

1葡盗、Understand

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

  • 優(yōu)點:

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

    • Parcelable用法要比Serializable復雜

</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對應, 便于理解
        readFromParcel(in);
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
       //切記非常重要, 寫數(shù)據(jù)(out.write...)和下面的讀數(shù)據(jù)(in.read...)的順序一定要和聲明的屬性順序?qū)? 不然會因為讀寫的數(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) {
        #//順序一定要對應上
        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)系作者
  • 序言:七十年代末竞慢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子愉棱,更是在濱河造成了極大的恐慌翎蹈,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遍愿,死亡現(xiàn)場離奇詭異存淫,居然都是意外死亡,警方通過查閱死者的電腦和手機沼填,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門桅咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坞笙,你說我怎么就攤上這事岩饼。” “怎么了薛夜?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵籍茧,是天一觀的道長。 經(jīng)常有香客問我梯澜,道長寞冯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任腊徙,我火速辦了婚禮简十,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撬腾。我一直安慰自己螟蝙,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布民傻。 她就那樣靜靜地躺著胰默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓踢。 梳的紋絲不亂的頭發(fā)上牵署,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音喧半,去河邊找鬼却妨。 笑死益愈,一個胖子當著我的面吹牛捻撑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脖隶,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暇检!你這毒婦竟也來了产阱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤块仆,失蹤者是張志新(化名)和其女友劉穎构蹬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悔据,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡庄敛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜暑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铐姚。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肛捍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情之众,我是刑警寧澤拙毫,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站棺禾,受9級特大地震影響缀蹄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膘婶,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一缺前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悬襟,春花似錦衅码、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至割捅,卻和暖如春奶躯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿驾。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工嘹黔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莫瞬。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓儡蔓,卻偏偏與公主長得像醉锄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浙值,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評論 25 707
  • 1.什么是Activity?問的不太多开呐,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應一個activit...
    JoonyLee閱讀 5,731評論 2 51
  • 各位烟勋,在你們的身邊,爺爺筐付、奶奶卵惦、外公、外婆的這四位瓦戚,至今仍尚在人世的還剩幾位呢沮尿?我的身邊到今年(2016年)為止一...
    溫莉2016閱讀 284評論 1 1
  • (1) 記得幾前年看電視訪談節(jié)目印衔,最喜歡的一位女演員嫁人了啡捶,當主持人問她,為什么會選擇某人做她的老公時奸焙,她一臉幸福...
    代連華閱讀 2,459評論 0 1
  • 中午第一更与帆,順便說一下我是小學生?了赌。 “呲呲嘶”“喂,可以聽到嗎36小組玄糟?”“可以勿她。”唐麟平靜的回答道茶凳∩┧“哇!好真...
    小真dada閱讀 197評論 0 0