intent.addExtra(parcelable Object)的NotSerializable异常

时间:2015-04-01 08:29:16

标签: java android android-intent arraylist parcel

我正在尝试将包含其他对象的ArrayList的一个对象传输到Android中的另一个Activity。我们的想法是将它们添加到ArrayList并显示它们,以便可以执行相关的任务。

Task ta = new Task(n, o, t, v, subList);

    Intent i = new Intent(this, ActivityList.class);
    i.putExtra("task", ta);
    startActivity(i);

这是意图。任务是Parcelable,subList是Subtask类的ArrayList,它也是Parcelable。 当然,既然ArrayList总是实现Serializable,那么Parcelling它们应该不是问题吗?构造函数参数是:String,byte,byte,byte,ArrayList。这些字节用作布尔值。

如果需要,这是任务的包裹代码:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(taskName);
    dest.writeByte((byte) (soundCueOne ? 1 : 0));
    dest.writeByte((byte) (soundCueTwo ? 1 : 0));
    dest.writeByte((byte) (vibrCue ? 1 : 0));
    dest.writeSerializable(myList);
}

private Task(Parcel in) {
    this.taskName = in.readString();
    this.soundCueOne = in.readByte() != 0;
    this.soundCueTwo = in.readByte() != 0;
    this.vibrCue = in.readByte() != 0;
    this.myList = (ArrayList<Subtask>) in.readSerializable();
}

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Task createFromParcel(Parcel in) {
        return new Task(in);
    }

    public Task[] newArray(int size) {
        return new Task[size];
    }
};

任何人都可以看到代码有什么问题吗?它显然在某个地方,甚至可能在Subtask类中,因为一旦构造Task并且它试图包裹它就会模拟器崩溃。

1 个答案:

答案 0 :(得分:1)

如果我看得正确,那么问题是您尝试将ArrayList<T>用作Serializable,即使它不是Serializable - 它也是Parcelable。

因此,请替换

dest.writeSerializable(myList);

dest.writeTypedList(myList);

并替换

this.myList = (ArrayList<Subtask>) in.readSerializable();

this.myList = in.readTypedList(new ArrayList<Subtask>(), Subtask.CREATOR);