Android Parcelable 接口用法小結(jié)

簡單的來說就是:在Intent或Bundle中無法直接放對象,必須把對象序列化為二進(jìn)制流才行,傳輸完成后要進(jìn)行反序列化,重新從流變?yōu)閷ο蟆?/p>

進(jìn)行Android開發(fā)的時(shí)候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個(gè)Intent或者Bundle里面,然后再傳遞。簡單來說就是將對象轉(zhuǎn)換為可以傳輸?shù)亩M(jìn)制流(二進(jìn)制序列)的過程,這樣我們就可以通過序列化,轉(zhuǎn)化為可以在網(wǎng)絡(luò)傳輸或者保存到本地的流(序列),從而進(jìn)行傳輸數(shù)據(jù) ,那反序列化就是從二進(jìn)制流(序列)轉(zhuǎn)化為對象的過程.
Parcelable是Android為我們提供的序列化的接口,Parcelable相對于Serializable的使用相對復(fù)雜一些,但Parcelable的效率相對Serializable也高很多,這一直是Google工程師引以為傲的,有時(shí)間的可以看一下Parcelable和Serializable的效率對比 Parcelable vs Serializable 號稱快10倍的效率

用的時(shí)候要注意:
寫構(gòu)造方法的時(shí)候要寫參數(shù)為Parcel的情況
要實(shí)現(xiàn)序列化、反序列化、描述這三個(gè)功能
描述很簡單,沒有特殊情況就返回0,目的是添加注釋描述類
序列化要注意使用對于參數(shù)類型的write

用一個(gè)小例子說明一下:

public class People implements Parcelable {
    private String mName;
    private int mAge;
    private boolean  mGender;
    private ArrayList<String> mJobs;
    private Friend mFriend;
    private ArrayList<Friend> mFriends= new ArrayList<>()

    public People() {}

    /**
     * 描述
     * 返回的是內(nèi)容的描述信息
     * 只針對一些特殊的需要描述信息的對象,需要返回1,其他情況返回0就可以
     *
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 序列化
     *
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mName);
        dest.writeInt(mAge);
        dest.writeByte((byte) (mGender ? 1 : 0));
        dest.writeStringList(mJobs);

        dest.writeParcelable(mFriend, flags);// 序列化對象的時(shí)候傳入要序列化的對象和一個(gè)flag,這里的flag幾乎都是0,除非標(biāo)識當(dāng)前對象需要作為返回值返回,不能立即釋放資源

        dest.writeTypedList(mFriends);

    }

    /**
     * 負(fù)責(zé)反序列化
     */
    public People(Parcel source) {
        mName= source.readString();
        mAge= source.readInt();
        mGender= source.readByte() != 0;
        mJobs= in.createStringArrayList();

        mFriend= source.readParcelable(Friend.class.getClassLoader()); // 讀取對象需要提供一個(gè)類加載器去讀取,因?yàn)閷懭氲臅r(shí)候?qū)懭肓祟惖南嚓P(guān)信息

        mFriends.readTypedList(mFriends, Friend.CREATOR); //對應(yīng)writeTypeList



    }

    private static final Creator<People> CREATOR = new Creator<People>() {
        /**
         * 從序列化對象中,獲取原始的對象
         * @param source
         * @return
         */
        @Override
        public Album createFromParcel(Parcel source) {
            return new People(source);
        }

        /**
         * 創(chuàng)建指定長度的原始對象數(shù)組
         * @param size
         * @return
         */
        @Override
        public People[] newArray(int size) {
            return new People[size];
        }
    };
}

下圖是過程模型:


Parcelable過程模型

寫入和讀取集合有兩種方式,
一是寫入類的相關(guān)信息,然后通過類加載器去讀取, –> writeList | readList;
二是不用類相關(guān)信息,創(chuàng)建時(shí)傳入相關(guān)類的CREATOR來創(chuàng)建 –> writeTypeList | readTypeList | createTypedArrayList
第二種效率高一些

一定要注意如果有集合定義的時(shí)候一定要初始化
public ArrayList<T> demo = new ArrayList<>();

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

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

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