Android Activity間傳值選擇,Serializable Or Parcelable

? 前言:Activity就是Android世界的controller,它們構(gòu)成了Android App里面的每一個(gè)頁面,當(dāng)然我們還會(huì)使用Fragment來將頁面進(jìn)一步劃分,通過Fragment可以對(duì)特定業(yè)務(wù)模塊的View+邏輯封裝,讓其與Activity解耦,同時(shí)還可以有自己的生命周期,讓我們控制布局繪制和進(jìn)行資源回收,這些都是Fragment的好處,以后有機(jī)會(huì)再談,今天,我們想討論的是Activity頁面之間跳轉(zhuǎn)時(shí),互相傳值的方法選擇。

? 我們知道,像int,long,double等基本類型和String都可以直接使用Intent類提供的putExtra方法直接打包傳遞,但很多時(shí)候,我們要傳遞的可能是一個(gè)實(shí)體類的對(duì)象,要傳遞一個(gè)實(shí)體類對(duì)象,有二種辦法,標(biāo)記類實(shí)現(xiàn)Serializable接口 或者 添加代碼實(shí)現(xiàn)Parcelable接口,注意的是Serializable接口沒有任何實(shí)際方法需要實(shí)現(xiàn),它只是一個(gè)標(biāo)記,標(biāo)記可以進(jìn)行序列化。Serialiable是Java提供的序列化接口,它將對(duì)象按規(guī)則轉(zhuǎn)化為字節(jié)隊(duì)列,字節(jié)隊(duì)列可以進(jìn)行網(wǎng)絡(luò)傳輸,這樣可以讓java的對(duì)象跨環(huán)境的進(jìn)行傳輸,序列化只能序列化成員變量,而靜態(tài)變量和方法不會(huì)被序列化,transient關(guān)鍵字修飾的變量也不會(huì)被序列化。Java中反序列化時(shí)通過SerialVersionUID來判斷是否能夠反序列化,所以需要序列化的類最好都能給出一個(gè)固定的SerialVersionUID值,如下

而Parcelable是Android提供的接口,它主要是通過writeToParcel(),將需要持久化的字段保存到一個(gè)Parcel對(duì)象里面,然后通過CREATOR

從Parcel對(duì)象中,取出相應(yīng)的字段,完成對(duì)象的恢復(fù),很明顯這里Parcelable有它的優(yōu)勢(shì),需要保存哪些字段我們可以自由控制,因?yàn)閷懡涌诒┞督o我們了,需要恢復(fù)哪些字段,我們同樣可以控制,所以相對(duì)于Serializable,存儲(chǔ)的代價(jià)小很多,因?yàn)镾erializable需要保存很多額外的字段來保證反序列化能夠成功。

? ? 現(xiàn)在我們還是通過一個(gè)具體的實(shí)例來介紹這二種Activity傳值的基本使用方法。假設(shè),我們現(xiàn)在有一個(gè)商品Good的列表,Good類是這樣的

第一個(gè)需求是點(diǎn)擊列表的一個(gè)cell,跳轉(zhuǎn)到Good的詳情頁,即我們需要將點(diǎn)擊對(duì)應(yīng)的Good對(duì)象傳遞到詳情Activity。第二個(gè)需求是點(diǎn)擊任何一個(gè)cell,將全部的Good信息傳遞到詳情Activity,即傳遞一個(gè)Good數(shù)組。

我們先來看第一個(gè)需求,先用Serializable的方法,發(fā)送很簡(jiǎn)單

接收對(duì)象也很簡(jiǎn)單

我們?cè)賮硎褂肞arcelable接口來傳遞,先定義一個(gè)類ParcelableGood

發(fā)送數(shù)據(jù)也很簡(jiǎn)單

接收也同樣類似

第一個(gè)需求很簡(jiǎn)單就搞定了,我們?cè)賮砀愣ǖ诙€(gè)需求,傳Good的數(shù)組給詳情Activity,如果使用Serializable的話,Intent沒有提供putExtra直接傳遞Good數(shù)組的重載方法,所以我們需要做一個(gè)包裝類,我新建一個(gè)WrapGood類如圖

這樣就可以直接傳遞一個(gè)WrapGood,間接達(dá)到傳遞Good數(shù)組的目的,

接收數(shù)據(jù)

因?yàn)镮ntent提供了putExtra方法直接傳遞Parcelable數(shù)組的重載,所以可以直接使用,

從Intent中取出Parcelable數(shù)組更簡(jiǎn)單

? 現(xiàn)在為止Good里面的屬性都是基本類型或者String,當(dāng)然它的屬性也可以是另外一個(gè)實(shí)體類,假設(shè)是GoodExtra類,這個(gè)時(shí)候如果要用Serializable序列化,GoodExtra也必須要標(biāo)記Serializable接口。如果要使用Parcelable,GoodExtra同樣要實(shí)現(xiàn)我們上面介紹的writeToParcel 和 CREATOR。

? 最后我們來做一個(gè)總結(jié),上面已經(jīng)介紹了在Android開發(fā)中Serializable和Parcelable的用法,我們推薦使用Parcelable,理由大致有3個(gè):1.Parcelable是Android 框架提供給我使用的,Google提供了比較好的接口和文檔支持,例如上面的putExtra,就有對(duì)Parcelable數(shù)組的重載方法。2. Parcelable效率更高,Parcelable底層實(shí)現(xiàn)是內(nèi)存的copy,速度很快,Serializable是IO操作,而且會(huì)用到反射,相對(duì)比較慢,國(guó)外有人測(cè)試過,Parcelable比Serializable從序列化到傳輸?shù)椒葱蛄谢?,平均要?0倍左右。3.最后一個(gè)原因也是最重要的原因,Parcelable要序列化哪些字段,我們完全可以控制,而且還可以在其中加入各種轉(zhuǎn)換,修飾,因?yàn)閷懡涌诒┞督o我們了,我們可以自由定制,而Serializable就顯的比較笨拙,而且需要一些額外的字節(jié)來存儲(chǔ)類的信息,當(dāng)然Serializable使用起來要更簡(jiǎn)單。這些都是它們?cè)诶碚撋系谋容^,項(xiàng)目中絕大多數(shù)場(chǎng)景,二者都可以完全勝任,具體用哪個(gè),見仁見智吧~~

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

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

  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2、Andro...
    隔壁老李頭閱讀 12,285評(píng)論 6 38
  • 本文主要內(nèi)容 Activity的生命周期、通信方式、Intent Filter 【Activity】一個(gè)Activ...
    cxm11閱讀 785評(píng)論 0 0
  • 剛學(xué)JS的DOM操作時(shí),就知道了匹配一堆元素,會(huì)獲得NodeList和HTMLCollection這兩個(gè)對(duì)象,不過...
    oopsist閱讀 2,449評(píng)論 0 2
  • 牛奶 雞蛋 香蕉 紅薯 桃仁 粗糧 蛋白質(zhì) 膳食纖維 堅(jiān)果
    Mehere閱讀 235評(píng)論 0 2
  • 當(dāng)下,人們都熱衷于來一場(chǎng)說走就走的旅行。有人選擇國(guó)內(nèi)游,有人選擇出境游,還有人是選擇窮游。 每當(dāng)朋友心情不好時(shí),她...
    isabellaLilove閱讀 477評(píng)論 0 0

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