我正在尝试将包含其他对象的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并且它试图包裹它就会模拟器崩溃。
答案 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);