我在为 Android 应用程序使用parcelables时遇到一些问题
我有一个名为Transport
的自定义类,其中包含一堆RoutePoint
个实例,这些实例已从文件加载并保存在数组中。
两个类implements Parcelable
,因为我想在多个活动之间传递包含Transport
个对象的RoutePoint
对象。
这带来了一个问题,因为在每个RoutePoint
对象内部,我有一个Transport
对象用于告诉哪个传输是RoutePoint
的父级。
假装我有这些课程:
Transport
:
public class Transport implements Parcelable
{
private RoutePoint[] points;
public Transport()
{
// Here the array is initialized
}
// Methods needed because of the Parcelable interface
}
RoutePoint
:
public class RoutePoint implements Parcelable
{
private Transport parent;
public RoutePoint(Transport parent)
{
this.parent = parent;
}
// Methods needed because of the Parcelable interface
}
当Transport
类写入Parcel
时,我会将数组中的所有RoutePoint
写入包裹。
当RoutePoint
类写入Parcel
时,我也会将父Transport
写入包裹。
这会导致“递归调用”和StackOverflowException
:
Transport
将RoutePoint
写入Parcel
。RoutePoint
将父Transport
写入Parcel
。Transport
将RoutePoint
写入Parcel
。 我想知道如何解决这个问题,并在活动之间传递Transport
类,并在parent
类中传递RoutePoint
对象某种方式。
答案 0 :(得分:2)
如果所有RoutePoint
实例始终包含在Transport
实例中,您可以通过不序列化RoutePoint.parent来修复它,而是在反序列化传输时进行设置。
因此,当您反序列化Transport实例时,反序列化RoutePoints,然后在这些RoutePoint实例上调用setTransport
方法并设置父实例。
答案 1 :(得分:0)
从GC角度来看,这样的循环引用也不是一个好主意。我建议你有一种方法参考,并使用像BiMap等其他数据结构来定义这些关系。 一种方法是在RoutePoint中创建一个Empty构造函数,并且只包括除父项之外的其他项。在运输中,从包裹中读取时,请稍后设置其参考。希望这是有道理的。