我在这里几乎已经阅读了如何将复杂对象传递给活动的主题。有两种方法可以做:
1)可序列化对象
2)Parcelable object
我看到的所有示例仍然是包含基本字段的简单对象或对象,或者这些字段可以是可序列化的或可分割的。现在,假设我有一个非常复杂的对象,例如:
public class ComplexObject{ private Class1 object1; private Class2 object2; .... private ClassN objectN; }
第i个对象可以包含非原始字段。现在,如果我想将 ComplexObject 传递给一个活动,我必须序列化或包裹每个字段 Class1,Class2,ClassN 。无论如何仍然通过我的 ComplexObject 而不执行每个序列化或parcelize?
答案 0 :(得分:2)
不,您的顶级对象必须是可序列化的,或者是parecelable,以便将其作为Extra传递,为了使其工作,任何子对象也必须是可序列化的或可分解的。
这些接口是系统知道如何打包数据的唯一方法。如果不实现它们,就无法知道如何将任意对象“分解”为可以作为Extra传递的基元。
答案 1 :(得分:2)
如果您的complexObject是一个应用程序模型,我建议将它放在Application
子类中,可以从任何组件(Activity
,Service
)访问它。如果您有更多对象,请将它们放在List
或Map
内部模型中,并在Activities
之间传递标识符。
无需制作所有内容Parcelable
。
答案 2 :(得分:1)
你可以通过Parcelable
public class MyParcelable implements Parcelable {
private Class1 object1;
private Class2 object2;
....
private ClassN objectN;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeParcelable(object1, flags)
out.writeParcelable(object2, flags)
...
out.writeParcelable(objectN, flags)
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
object1 = in.readParcelable(Class1.class.getClassLoader());
object2 = in.readParcelable(Class2.class.getClassLoader());
...
objectN = in.readParcelable(ClassN.class.getClassLoader());
}
}
我认为Class1
,Class2
,...,ClassN
已经实施Parcelable
。