Android Parcelable 方法中出现堆栈溢出错误

Getting stack overflow error in Android Parcelable methods

我有两个 类 实现了 Parcelable:

public class A implements Parcelable {
    private List<B> bList;

    ... //everything else omitted

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeTypedList(this.bList);
    }

}

然后

public class B implements Parcelable {
    private A a;

    ... //everything else omitted

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(this.a, flags);
    }

}

换句话说,A 有一个 B 对象的列表,每个 B 持有对 A 对象的引用。

但是我刚刚注意到一种情况,在保存实例状态调用期间,应用程序炸毁了堆栈,因为我怀疑它在两者之间一遍又一遍地递归调用这些 Parcel 写入函数。

有什么方法可以在不炸毁堆栈的情况下将这些写入 Parcel 吗?

鉴于你在评论中提到的事情,听起来你总是会从解包 A 的实例开始,所以你在解包 B 时可以使用它。在那种情况下,不要将 B.a 写入 Parcel;当您完成解包 A.

时,改为 AbList 中的所有元素上设置 B.a
public class A implements Parcelable {
    private List<B> bList;

    /* ... */

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeTypedList(this.bList);
    }

    // called by your Parcelable.Creator
    private A(Parcel in) {
        bList = new ArrayList<>();
        in.readTypedList(bList, B.CREATOR);
        for (B b : bList) {
            b.a = this; // or b.setA(this)
        }
    }
}

public class B implements Parcelable {
    private A a;

    /* ... */

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // write everything EXCEPT a
    }

    // called by your Parcelable.Creator
    private B(Parcel in) {
        // Read everything EXCEPT a
    }
}

也就是说,您还可以检查为什么存在这种循环依赖关系,看看您的代码是否有一些逻辑重组可以打破这种循环。在不了解您的 类 或它们的使用方式的情况下,我无法提供除此之外的任何指导。