1.parcelable和serializable

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
1.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
2.parcelable是官方提供的接口,在内存中操作,传递效率高。
页面之间的传递时使用parcelable,如果是长时间保存使用serialble,因为serialble保存在磁盘中,而parcelable在内存中操作容易丢失数据。

2.parcelable使用

2.1 使用注解的方式

kotlin开发可以使用注解方式实现,省去写的麻烦,在配置文件中加入以下配置。

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'kotlin-kapt'
}

android {
    ...
    androidExtensions {
        experimental = true
    }
    ...
	...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

在实体类中加入注解即可。

@Parcelize
data class User(var name: String, var data: String) : Parcelable

2.2手动实现

含有list字段的对象本身也要实现parcelable

data class UserInfoBean(
    val userId: String?,
    val ladderDetails: ArrayList<LadderDetails> = arrayListOf()
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.createTypedArrayList(LadderDetails.CREATOR) as ArrayList<LadderDetails>
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(userId)
        parcel.writeTypedList(ladderDetails)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<UserInfoBean> {
        override fun createFromParcel(parcel: Parcel): UserInfoBean {
            return UserInfoBean(parcel)
        }

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


}

class LadderDetails(
    val ladderName: String?
    val remain: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString()
        parcel.readString()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(ladderName)
        parcel.writeString(remain)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<LadderDetails> {
        override fun createFromParcel(parcel: Parcel): LadderDetails {
            return LadderDetails(parcel)
        }

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

}

页面之间传递

startActivity(Intent(this, NewActivity::class.java)
		.putExtra("userInfo",userInfo as Parcelable))

newActivity接收

private val userInfo by lazy {
        intent.getParcelableExtra<UserInfoBean>("userInfo")
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐