Java 包含自身阵列列表的包裹

Java 包含自身阵列列表的包裹,java,android,arraylist,parcelable,parcel,Java,Android,Arraylist,Parcelable,Parcel,我正在尝试将一个类别列表从一个活动传递到另一个活动。我在类上实现了Parcelable,但每次都会使应用程序崩溃。注意:活动在未传递额外信息时有效。 注2:我看不到任何日志,只是太慢,突然“D/AndroidRuntime”﹕ 关闭虚拟机“ 这是包裹: public class Category implements Parcelable{ private String categoryId; private String name; private boolean active; pr

我正在尝试将一个类别列表从一个活动传递到另一个活动。我在类上实现了Parcelable,但每次都会使应用程序崩溃。注意:活动在未传递额外信息时有效。 注2:我看不到任何日志,只是太慢,突然“D/AndroidRuntime”﹕ 关闭虚拟机“

这是包裹:

public  class   Category implements Parcelable{

private String categoryId;
private String name;
private boolean active;
private String slug;
private String externalId;
private String parentId;
private Integer level;
private String categoryTreeNodeId;
private ArrayList<Category> children;


public Category() {}

// Getters and Setters...

@Override
public int describeContents() {
    // ignore for now
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(categoryId);
    dest.writeString(name);
    dest.writeByte((byte) (active ? 1 : 0));
    dest.writeString(slug);
    dest.writeString(externalId);
    dest.writeString(parentId);
    dest.writeInt(level);
    dest.writeString(categoryTreeNodeId);
    dest.writeTypedList(children);
}

/** Static field used to regenerate object, individually or as arrays */
public static final Parcelable.Creator<Category> CREATOR = new Parcelable.Creator<Category>() {
    public Category createFromParcel(Parcel pc) {
        return new Category(pc);
    }
    public Category[] newArray(int size) {
        return new Category[size];
    }
};

/**Ctor from Parcel, reads back fields IN THE ORDER they were written */
public Category(Parcel in){
    categoryId = in.readString();
    name = in.readString();
    active = in.readByte() != 0;
    slug = in.readString();
    externalId = in.readString();
    parentId = in.readString();
    level =  in.readInt();
    categoryTreeNodeId = in.readString();
    in.readTypedList(children, Category.CREATOR);
}
公共类类别实现可包裹{
私有字符串类别ID;
私有字符串名称;
私有布尔活动;
私有串段塞;
私有字符串外部化;
私有字符串parentId;
私有整数级;
私有字符串categoryTreeNodeId;
私人ArrayList儿童;
公共类别(){}
//接球手和接球手。。。
@凌驾
公共int描述内容(){
//暂时忽略
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面资本(类别ID);
目的地书面记录(名称);
目标写入字节((字节)(活动?1:0));
目的写入限制(slug);
目的写入限制(外部ID);
目的写入字符串(父ID);
目的写入(级别);
目的写入目录(categoryTreeNodeId);
目的地写入列表(儿童);
}
/**用于单独或作为数组重新生成对象的静态字段*/
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共类别createFromParcel(地块pc){
返回新类别(pc);
}
公共类别[]新数组(整数大小){
返回新类别[大小];
}
};
/**从包裹中选择Ctor,按字段写入的顺序读回字段*/
公共类别(包裹中){
categoryId=in.readString();
name=in.readString();
active=in.readByte()!=0;
slug=in.readString();
externalId=in.readString();
parentId=in.readString();
级别=in.readInt();
categoryTreeNodeId=in.readString();
in.readTypedList(子类,Category.CREATOR);
}
}

以下是我对该活动的称呼:

ArrayList<Category> list = currentCategory.getChildren();
    intent.putParcelableArrayListExtra(SubCategoryActivity.EXTRA_CATEGORY_LIST, list);
    intent.putExtra(SubCategoryActivity.EXTRA_CURRENT_CAT_NAME, currentCategory.getName());
    context.startActivity(intent);
ArrayList list=currentCategory.getChildren();
intent.putParcelableArrayListExtra(子类别activity.EXTRA_CATEGORY_LIST,LIST);
intent.putExtra(subcategory activity.EXTRA_CURRENT_CAT_NAME,currentCategory.getName());
背景。开始触觉(意图);
额外的\u当前的\u CAT\u名称只是一个字符串,它工作得非常好

我相信问题出在ArrayList上。有没有类似的建议或经验

谢谢

我得到的唯一日志是:

08-04 17:56:21.529 30543-30543/com.example.test D/AndroidRuntime﹕ 关闭虚拟机 08-04 17:56:41.554 30543-30552/com.example.test I/art﹕ 线程[5,tid=30552,WaitingMainSignalCatcherLoop,线程*=0xb81e22d0,对等方=0x12c00080,“信号捕捉器”]:对信号3作出反应 08-04 17:56:41.554 30543-30552/com.example.test I/art﹕ [08-04 17:56:41.754 787:809 I/进程] 发送信号。PID:787信号:3


您的问题是由于将键入的列表读取到空容器中引起的:

in.readTypedList(children, Category.CREATOR);
这有点令人困惑,但是
readTypedList
的用例要求传入的
List
参数为非空。我建议将此更改为使用:

children = in.createTypedArrayList(Category.CREATOR);

如果在将列表写入包裹时列表为空,这也将保持空值。

您可以发布堆栈跟踪吗?可能错误不在你认为的地方。乍一看,实现看起来很好。@kcopock请参阅更新,但没有太多。。。在执行操作之前,我已经清理过了,只有这些。