在Android Parcelable方法中获取堆栈溢出错误

时间:2016-10-14 03:19:23

标签: android stack-overflow parcelable parcel

我有两个实现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个对象的引用。

但是我刚刚注意到一种情况,即在保存实例状态调用期间,app会炸毁堆栈,因为我怀疑它是在两者之间反复调用这些Parcel写入函数。

有没有办法在没有炸毁堆栈的情况下将这些写入包裹?

1 个答案:

答案 0 :(得分:0)

鉴于您在评论中提到的内容,听起来您总是会开始展开A的实例,因此在取消B时,您可以使用此功能。在这种情况下,请勿将B.a写入Parcel;相反,当您完成取消A时,B.a会对bList中的所有元素设置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
    }
}

也就是说,您可能还会检查为什么存在这种循环依赖关系,并查看是否存在可以打破此循环的代码的某些逻辑重构。在不了解您的课程或如何使用课程的情况下,我无法提供任何指导。