简体   繁体   English

将包裹从活动A传递到活动B-getExtra为空

[英]Passing Parcelable from Activity A to Activity B - getExtra is null

When I use Intent to pass a Parcelable object from Activity A to Activity B, B activity getExtra is null. 当我使用Intent于通过Parcelable从活动A对象到活动B,B的活性getExtra为空。 Following my code: 按照我的代码:

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)
        }
    }
}

class B 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)
        }
    }
}

I use intent to pass data: 我使用意图来传递数据:

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)

I am using following code to retrieve data: 我正在使用以下代码来检索数据:

val bundle = intent.extras
val a:A = bundle.getParcelable("frank")

Is this data structure a dead loop when write Parcelable? 编写Parcelable时,此数据结构是否为死循环?

There are two issues that you're running into. 您遇到了两个问题。

First, the writeToParcel() function on class B is reading instead of writing. 首先,类B上的writeToParcel()函数正在读取而不是写入。 You most likely meant to do this: 您最有可能打算这样做:

override fun writeToParcel(p0: Parcel, p1: Int) {
    p0.writeInt(id)
    p0.writeString(name)
    p0.writeParcelable(a, 0)
}

Once you make that change, you'll run into the second issue: you'll get a stack overflow error because your models have dependencies on each other. 进行更改后,您将遇到第二个问题:由于模型之间存在相互依赖关系,因此会出现堆栈溢出错误。 A depends on a list of B objects, each of which has a reference to the A object again. A依赖于B对象的列表,每个对象都再次引用了A对象。 This circular dependency is not a supported by Android's parceling code. Android的包裹代码不支持这种循环依赖关系

There was a bug ticket opened about this many years ago, but its status is marked as Won't Fix (Infeasible) . 大约在此之前,有一张错误单被打开,但是它的状态被标记为Won't Fix (Infeasible)

There are some workarounds mentioned in another SO post , but in general, it's best to avoid circular dependencies if at all possible. 另一篇SO文章中提到了一些变通方法,但总的来说,最好是尽可能避免循环依赖。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM