乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android初學(xué)之Parcel和Parcelable

       jiffes 2019-02-12
      最近在看項(xiàng)目源碼的時(shí)候經(jīng)常看到Parcel和Parcelable的字眼,所以花了點(diǎn)時(shí)間了解一下。
      
      • 1

      Parcel


      Parcel是一個(gè)用于包裝各種數(shù)據(jù)的容器類,凡是經(jīng)過(guò)Parcel包裝后的數(shù)據(jù)都可以通過(guò)在binder進(jìn)程間通信IPC中進(jìn)行服務(wù)端和數(shù)據(jù)端的數(shù)據(jù)交互,AIDL中也用到了Parcel進(jìn)行數(shù)據(jù)封裝。
      現(xiàn)在簡(jiǎn)單介紹一下,使用Parcel包裝后進(jìn)程間通信的工作大致的原理:
      假如有進(jìn)程A、B需要進(jìn)行通信,在進(jìn)程A中用Parcel將需要傳輸?shù)臄?shù)據(jù)類中的飛默認(rèn)值和唯一類標(biāo)識(shí)打包(此過(guò)程稱為序列化),再把這個(gè)包傳輸?shù)竭M(jìn)程B中,進(jìn)程B通過(guò)這個(gè)包中的唯一標(biāo)示將會(huì)重新創(chuàng)建一個(gè)一模一樣的類對(duì)象,這就是通信的大概過(guò)程。
      雖然,parcel在網(wǎng)上是這么被描述的,但是對(duì)于初學(xué)Android的我來(lái)說(shuō)還是不懂,所以就去看了一下源碼部分。


      Parcel is <strong>not</strong> a general-purpose
      serialization mechanism.  This class (and the corresponding
      {@link Parcelable} API for placing arbitrary objects into a Parcel) is designed as a high-performance IPC transport.
      • 1
      • 2
      • 3

      從上面可以看出,parcel不是一般用途的序列化機(jī)制,這個(gè)類以及與之相匹配的Parcelable接口(Parcelable能夠?qū)⑷我獾膶?duì)象打包進(jìn)parcel實(shí)例中)使IPC數(shù)據(jù)傳輸更加的高效。

      另外,Parcel類中的核心部分涉及了不同數(shù)據(jù)類型到parcel對(duì)象的讀寫的實(shí)現(xiàn)。其中,基本類型(long、int、String、double等)是可以直接進(jìn)行打包或者讀取的,但是自定義的類型必須在實(shí)現(xiàn)了Parcelable后才能進(jìn)行打包。

      看到的幾個(gè)應(yīng)該注意的點(diǎn):
      1)obtain()和recycle()方法,一個(gè)類似于new一個(gè)parcel對(duì)象,一個(gè)回收一個(gè)parcel對(duì)象。
      2)涉及Map的write或者read操作,一般的推薦使用writeBundle和readBundle,因?yàn)閞eadMap或者writeMap方法的花銷要比前者大的多,所以不推薦使用。
      3)dataSize()和dataCapacity()的含義有所區(qū)別:前者表示實(shí)際大小,后者表示一個(gè)parcel分配到的大小,一般是大于dataSize的。

      另外:源碼中幾乎都是readXXXX和writeXXXX的方法,這也說(shuō)明了parcel的功能和他的地位。

      Parcelable

      字面意義上來(lái)講,是一個(gè)使對(duì)象能夠parcel的接口。上面的描述中,我們提到了parcel如果想要打包自定義的數(shù)據(jù)結(jié)構(gòu),那么這個(gè)自定義的類必須實(shí)現(xiàn)Parcelable的方法。所以,我們可以這么理解Parcelable:他是一個(gè)使自定義類對(duì)象具有序列化能力的接口,凡是實(shí)現(xiàn)了該接口的類對(duì)象都能夠被parcel。

      Parcelable中有兩個(gè)使自定義類具備parcel能力的方法(接口):
      1)public void writeToParcel(Parcel dest,int flags),實(shí)現(xiàn)這個(gè)方法又該如何做呢?我們知道哪怕是自定義類,他的成員最終也會(huì)是基本類型,所以我們只需要將每一個(gè)基本類型的成員屬性利用dest.writeXXXX打包進(jìn)Parcel dest中去。而非基本類型的自定義成員屬性,我們可以繼續(xù)實(shí)現(xiàn)Parcelable接口。

      2)public interface Creator< T >,其中包含兩個(gè)方法:public T createFromParcel(Parcel source)和public T[] newArray(int size)。
      用于從Parcel中取出指定的數(shù)據(jù)類型。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多