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
.
时,改为 A
在 bList
中的所有元素上设置 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
}
}
也就是说,您还可以检查为什么存在这种循环依赖关系,看看您的代码是否有一些逻辑重组可以打破这种循环。在不了解您的 类 或它们的使用方式的情况下,我无法提供除此之外的任何指导。
我有两个 类 实现了 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
.
A
在 bList
中的所有元素上设置 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
}
}
也就是说,您还可以检查为什么存在这种循环依赖关系,看看您的代码是否有一些逻辑重组可以打破这种循环。在不了解您的 类 或它们的使用方式的情况下,我无法提供除此之外的任何指导。