android parcelable
android parcelable使用
·
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")
}
更多推荐
已为社区贡献2条内容
所有评论(0)