Android 中Kotlin實現(xiàn)Parcelable

作為android開發(fā)者都知道,開發(fā)中具備兩種序列化的操作惠拭,一個是Serializable扩劝,另一個是在Android中引入的Parcelable庸论;從google官網(wǎng)的態(tài)度而言,Parcelable的效率更高棒呛。但是兩者的實現(xiàn)方式卻有很大區(qū)別聂示,舉個例子

image.png

Serializable

class Human:Serializable {
    
}

Parcelable

class Person() :Parcelable {

    var name:String = ""
    var age:Int = 0

    constructor(parcel: Parcel) : this() {
    }

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeString(name)
        dest.writeInt(age)
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            val person = Person()
            person.name = parcel.readString()?:""
            person.age = parcel.readInt()?:0
            return person
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

發(fā)現(xiàn)什么問題了嗎?沒錯簇秒,Percelable的實現(xiàn)方式更復(fù)雜鱼喉,Serializable只需實現(xiàn)一個接口就完成了,管他那么多趋观,Serializable就完事了(這也是我至今都喜歡Serializable的原因)

后面在閱讀官方文檔的時候扛禽,發(fā)現(xiàn)Percelable也有了簡單的方式,而且官方也是推薦使用 Percelable皱坛,所以還是更改了使用習(xí)慣编曼,而且,新的方式也很簡單點擊跳轉(zhuǎn)

image.png

1.Parcelable 實現(xiàn)生成器

首先引入組件

plugins {
    id 'kotlin-parcelize'
}

實現(xiàn)類主體結(jié)構(gòu)

import kotlinx.parcelize.Parcelize

@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

2.自定義序列化邏輯

有的同學(xué)就會問了剩辟,如果我想自己寫序列化和反序列化邏輯呢掐场?當(dāng)然也有辦法,就是在類內(nèi)部實現(xiàn)write和create方法

@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): User {
            // Custom read implementation
        }
    }
}

3.Parcelable 支持的類型

應(yīng)該說大部分的類型就是支持贩猎,但是如果真遇到了某個類型不被支持熊户,但是開發(fā)者就是想要序列化,Parcelable也有自定義的方法吭服,就是

class ExternalClass(val value: Int)

object ExternalClassParceler : Parceler<ExternalClass> {
    override fun create(parcel: Parcel) = ExternalClass(parcel.readInt())

    override fun ExternalClass.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(value)
    }
}

使用也很方便

// Class-local parceler
@Parcelize
@TypeParceler<ExternalClass, ExternalClassParceler>()
class MyClass(val external: ExternalClass) : Parcelable

// Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) : Parcelable

// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) : Parcelable

簡單也易上手嚷堡,但是也溫馨提醒,大量數(shù)據(jù)跨組件傳遞噪馏,會存在為以下情況


image.png

因為intent中能帶的數(shù)據(jù)有上限(這個根據(jù)不同的android廠商而異)麦到,建議這時候試用viewmodel來做數(shù)據(jù)傳遞

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市欠肾,隨后出現(xiàn)的幾起案子瓶颠,更是在濱河造成了極大的恐慌,老刑警劉巖刺桃,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粹淋,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑟慈,警方通過查閱死者的電腦和手機桃移,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛碧,“玉大人借杰,你說我怎么就攤上這事〗茫” “怎么了蔗衡?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵纤虽,是天一觀的道長。 經(jīng)常有香客問我绞惦,道長逼纸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任济蝉,我火速辦了婚禮杰刽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘王滤。我一直安慰自己贺嫂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布雁乡。 她就那樣靜靜地躺著涝婉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔗怠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天吩跋,我揣著相機與錄音寞射,去河邊找鬼。 笑死锌钮,一個胖子當(dāng)著我的面吹牛桥温,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梁丘,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼侵浸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氛谜?” 一聲冷哼從身側(cè)響起掏觉,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎值漫,沒想到半個月后澳腹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡杨何,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年酱塔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片危虱。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡羊娃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃跷,到底是詐尸還是另有隱情蕊玷,我是刑警寧澤邮利,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站集畅,受9級特大地震影響近弟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挺智,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一哭靖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勤庐,春花似錦曙搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扇苞,卻和暖如春欺殿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳖敷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工脖苏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人定踱。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓棍潘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崖媚。 傳聞我的和親對象是個殘疾皇子亦歉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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