美文网首页Android
Android 中Kotlin实现Parcelable

Android 中Kotlin实现Parcelable

作者: 诡异的叶子 | 来源:发表于2021-12-08 18:37 被阅读0次

    作为android开发者都知道,开发中具备两种序列化的操作,一个是Serializable,另一个是在Android中引入的Parcelable;从google官网的态度而言,Parcelable的效率更高。但是两者的实现方式却有很大区别,举个例子

    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)
            }
        }
    }
    

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

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

    image.png

    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来做数据传递

    image.png

    相关文章

      网友评论

        本文标题:Android 中Kotlin实现Parcelable

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