将Parcelable从Activity A传递给Activity B - getExtra为null

时间:2018-04-20 10:46:57

标签: android android-intent kotlin

当我使用IntentParcelable对象从活动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时,此数据结构是否为死循环?

1 个答案:

答案 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中提到了一些解决方法,但总的来说,如果可能的话,最好避免循环依赖。