如何将包含 Parcelable class 'B' 实例的 Parcelable class 'A' 实例写入 Parcel from class 'B'
How to write an instance of Parcelable class 'A' which contains an instance of parcelable class 'B', to Parcel from class 'B'
我在为我的 Android 应用程序使用 parcelables 时遇到了一些问题。
我有一个名为 Transport
的自定义 class,它包含一堆 RoutePoint
-实例,这些实例已从文件加载并保存在数组中。
class 和 implements Parcelable
都是,因为我想在多个活动之间传递包含 RoutePoint
个对象的 Transport
对象。
这带来了一个问题,因为在每个 RoutePoint
对象内部,我都有一个 Transport
对象用于告诉哪个传输是 RoutePoint
.[=47= 的父对象]
假设我有这些 classes:
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
class写入Parcel
时,我也将数组中的RoutePoint
全部写入parcel
当RoutePoint
class写到Parcel
时,我也将父Transport
写到parcel
这会导致 "recursive call" 和 WhosebugException
:
Transport
写一个 RoutePoint
到 Parcel
。
RoutePoint
将父 Transport
写入 Parcel
。
- 父
Transport
将 RoutePoint
写入 Parcel
。
- 返回第 2 步。
我想知道如何解决这个问题,并在活动之间传递 Transport
class,并传递 parent
对象在某种程度上 RoutePoint
class。
如果所有 RoutePoint
个实例始终包含在一个 Transport
实例中,您可以通过不序列化 RoutePoint.parent 来修复它,而是在反序列化 Transport 时设置它。
因此,当您反序列化 Transport 实例时,反序列化 RoutePoints,然后在这些 RoutePoint 实例上调用 setTransport
方法并设置父级。
从 GC 的角度来看,拥有这样的循环引用也不是一个好主意。我建议您使用一种方式参考并使用其他数据结构(如 BiMap 等)来定义这些关系。
一种方法是在 RoutePoint 中创建一个 Empty 构造函数,并且只包裹除父级之外的其他项目。在 Transport 中,在读取包裹时,稍后设置其参考。希望这是有道理的。
我在为我的 Android 应用程序使用 parcelables 时遇到了一些问题。
我有一个名为 Transport
的自定义 class,它包含一堆 RoutePoint
-实例,这些实例已从文件加载并保存在数组中。
class 和 implements Parcelable
都是,因为我想在多个活动之间传递包含 RoutePoint
个对象的 Transport
对象。
这带来了一个问题,因为在每个 RoutePoint
对象内部,我都有一个 Transport
对象用于告诉哪个传输是 RoutePoint
.[=47= 的父对象]
假设我有这些 classes:
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
class写入Parcel
时,我也将数组中的RoutePoint
全部写入parcel
当RoutePoint
class写到Parcel
时,我也将父Transport
写到parcel
这会导致 "recursive call" 和 WhosebugException
:
Transport
写一个RoutePoint
到Parcel
。RoutePoint
将父Transport
写入Parcel
。- 父
Transport
将RoutePoint
写入Parcel
。 - 返回第 2 步。
我想知道如何解决这个问题,并在活动之间传递 Transport
class,并传递 parent
对象在某种程度上 RoutePoint
class。
如果所有 RoutePoint
个实例始终包含在一个 Transport
实例中,您可以通过不序列化 RoutePoint.parent 来修复它,而是在反序列化 Transport 时设置它。
因此,当您反序列化 Transport 实例时,反序列化 RoutePoints,然后在这些 RoutePoint 实例上调用 setTransport
方法并设置父级。
从 GC 的角度来看,拥有这样的循环引用也不是一个好主意。我建议您使用一种方式参考并使用其他数据结构(如 BiMap 等)来定义这些关系。 一种方法是在 RoutePoint 中创建一个 Empty 构造函数,并且只包裹除父级之外的其他项目。在 Transport 中,在读取包裹时,稍后设置其参考。希望这是有道理的。