美文网首页
Android 中Kotlin实现Parcelable

Android 中Kotlin实现Parcelable

作者: hao_developer | 来源:发表于2022-06-06 10:45 被阅读0次

开发中具备两种序列化的操作,一个是Serializable,另一个是在Android中引入的Parcelable;从google官网的态度而言,Parcelable的效率更高。但是两者的实现方式却有很大区别,举个例子
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)
        }
    }
}

发现什么问题了吗?没错,Percelable的实现方式更复杂,Serializable只需实现一个接口就完成了,管他那么多,Serializable就完事了(这也是我至今都喜欢Serializable的原因)

后面在阅读官方文档的时候,发现Percelable也有了简单的方式,而且官方也是推荐使用 Percelable,所以还是更改了使用习惯,而且,新的方式也很简单点击跳转

1.Parcelable 实现生成器

首先引入组件

plugins {
    id 'kotlin-parcelize'
}

实现类主体结构

import kotlinx.parcelize.Parcelize
 
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

2.自定义序列化逻辑

如果我想自己写序列化和反序列化逻辑呢?当然也有办法,就是在类内部实现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 支持的类型

应该说大部分的类型就是支持,但是如果真遇到了某个类型不被支持,但是开发者就是想要序列化,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

简单也易上手,但是也温馨提醒,大量数据跨组件传递,会存在为以下情况


image.png

因为intent中能带的数据有上限(这个根据不同的android厂商而异),建议这时候试用viewmodel来做数据传递

相关文章

网友评论

      本文标题:Android 中Kotlin实现Parcelable

      本文链接:https://www.haomeiwen.com/subject/cfqjmrtx.html