当我使用Intent
将Parcelable
对象从活动A传递给活动B时,B活动getExtra为空。按照我的代码:
class A(var id: Int, var name: String,var bList:MutableList<B>) : Parcelable {
override fun writeToParcel(p0: Parcel, p1: Int) {
p0.writeInt(id)
p0.writeString(name)
p0.writeTypedList(bList)
}
override fun describeContents(): Int {
return 0
}
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString(),
parcel.createTypedArrayList(B.CREATOR)
)
companion object CREATOR : Parcelable.Creator<A> {
override fun createFromParcel(parcel: Parcel): A {
return A(parcel)
}
override fun newArray(size: Int): Array<A?> {
return arrayOfNulls(size)
}
}
}
B级
class B(var id: Int, var name: String, var a: A) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString(),
parcel.readParcelable(A::class.java.classLoader))
override fun writeToParcel(p0: Parcel, p1: Int) {
p0.readInt()
p0.readString()
p0.readParcelable<A>(A.javaClass.classLoader)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<B> {
override fun createFromParcel(parcel: Parcel): B {
return B(parcel)
}
override fun newArray(size: Int): Array<B?> {
return arrayOfNulls(size)
}
}
}
我使用intent传递数据:
val list = mutableListOf<B>()
val a = A(1,"A",list)
val b1 = B(1,"B1",a)
val b2 = B(2,"B2",a)
list.add(b1)
list.add(b2)
val intent = Intent()
intent.setClass(context, AboutActivity::class.java)
intent.putExtra("frank",a)
startActivity(intent)
我正在使用以下代码来检索数据:
val bundle = intent.extras
val a:A = bundle.getParcelable("frank")
写Parcelable时,此数据结构是否为死循环?
答案 0 :(得分:0)
您遇到了两个问题。
首先,类writeToParcel()
上的B
函数正在读取而不是写入。你最有可能这样做:
override fun writeToParcel(p0: Parcel, p1: Int) {
p0.writeInt(id)
p0.writeString(name)
p0.writeParcelable(a, 0)
}
进行更改后,您将遇到第二个问题:您将收到堆栈溢出错误,因为您的模型之间存在依赖关系。 A
取决于B
个对象的列表,每个对象都会再次引用A
个对象。此Android circular dependency不支持Android的parceling代码。
多年前有一个bug ticket被打开,但其状态标记为Won't Fix (Infeasible)
。
another SO post中提到了一些解决方法,但总的来说,如果可能的话,最好避免循环依赖。