1.使用记录使用Parcelable进行类序列化的方式(还可以使用
Serialize
接口,本文不作介绍),以及如何使用intent传递自定义对象类的数组(ArrayList
)本文的前提是,使用Kotlin语言进行安卓开发
@Parcelize
注解自动生成Parcelize
实现
需要添加对Parcelable
的支持,需要将以下的Gradle
插件添加到应用的build.gradle
文件中:
plugins {
id 'kotlin-parcelize'
}
当使用@Parcelize
为类添加注解时,系统就会自动生成一个Parcelable
实现,如下所示
@Parcelize
class PersonInfo(val name:String,val age:Int,val height:Double) : Parcelable {
var name = ""
var age = 0
var height = 0.0
}
使用上述方式,就会自动生成Parcelable
实现,从而完成对PersonInfo
类的序列化。但是使用@parcelize
注解,只会序列化主要构造函数中的所有参数(!!!此处有坑)。如果没有构造函数或者不希望构造函数中的所有参数都被序列化,可以通过实现伴随类来自定义更高级的序列化和反序列化逻辑。如下所示:
@Parcelize
class PersonInfo : Parcelable {
var name = ""
var age = 0
var height = 0.0
override fun toString(): String {
return "姓名:$name 年龄:$age 身高:$height"
}
companion object : Parceler<PersonInfo> {
override fun PersonInfo.write(p0: Parcel, p1: Int) {
p0.writeDouble(height)
p0.writeInt(age)
p0.writeString(name)
}
override fun create(parcel: Parcel): PersonInfo {
var personInfo = PersonInfo()
personInfo.height = parcel.readDouble()
personInfo.age = parcel.readInt()
personInfo.name = parcel.readString().toString()
return personInfo
}
}
}
2.实现Parcelable接口
第二种办法就是不使用注解自动生成Parcelable实现,而是直接实现Parcelable接口,示例代码如下:
class PersonInfo() : Parcelable {
var name = ""
var age = 0
var height = 0.0
constructor(parcel: Parcel) : this() {
name = parcel.readString().toString()
age = parcel.readInt()
height = parcel.readDouble()
}
override fun toString(): String {
return "姓名:$name 年龄:$age 身高:$height"
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(name)
parcel.writeInt(age)
parcel.writeDouble(height)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<PersonInfo> {
override fun createFromParcel(parcel: Parcel): PersonInfo {
return PersonInfo(parcel)
}
override fun newArray(size: Int): Array<PersonInfo?> {
return arrayOfNulls(size)
}
}
}
相对而言,使用注解的方式会更加简介,只需要实现序列化和反序列化的核心逻辑即可。
3. 传递ArrayList
最后是,在两个Activity
之间传递PersonInfo
列表,即ArrayList
。记作从FirstActivity
跳转到SecondActivity
并且传入ArrayList
对象。
FirstActivity
相关代码(写数据)如下:
// 生命需要传入的参数
var infoList = ArrayList<PersonInfo>()
// 启动SecondActivity并且传入参数
var intent = Intent()
intent.setClass(this,SecondActivity::class.java)
intent.putParcelableArrayListExtra("infoList",infoList)
startActivity(intent)
SecondActivity
相关代码(读取数据)如下:
var infoList = intent.getParcelableArrayListExtra<PersonInfo>("infoList") as ArrayList<PersonInfo>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)