我有两个实现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写入函数。
有没有办法在没有炸毁堆栈的情况下将这些写入包裹?
答案 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
}
}
也就是说,您可能还会检查为什么存在这种循环依赖关系,并查看是否存在可以打破此循环的代码的某些逻辑重构。在不了解您的课程或如何使用课程的情况下,我无法提供任何指导。