如何编写Parcelable类的实例' A'其中包含一个可分类的实例' B',来自类' B'

时间:2015-03-24 18:37:24

标签: java android recursion parcelable

我在为 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

  1. TransportRoutePoint写入Parcel
  2. RoutePoint将父Transport写入Parcel
  3. TransportRoutePoint写入Parcel
  4. 返回第2步。

  5. 我想知道如何解决这个问题,并在活动之间传递Transport类,并在parent类中传递RoutePoint对象某种方式。

2 个答案:

答案 0 :(得分:2)

如果所有RoutePoint实例始终包含在Transport实例中,您可以通过不序列化RoutePoint.parent来修复它,而是在反序列化传输时进行设置。

因此,当您反序列化Transport实例时,反序列化RoutePoints,然后在这些RoutePoint实例上调用setTransport方法并设置父实例。

答案 1 :(得分:0)

从GC角度来看,这样的循环引用也不是一个好主意。我建议你有一种方法参考,并使用像BiMap等其他数据结构来定义这些关系。 一种方法是在RoutePoint中创建一个Empty构造函数,并且只包括除父项之外的其他项。在运输中,从包裹中读取时,请稍后设置其参考。希望这是有道理的。