我的类 ExpenseFB
实现了 Parcelable
,其中包含一个 UserFB
的 Map
(也实现了 Parcelable
):
ExpenseFB
:
public class ExpenseFB implements Parcelable {
private String id;
private String name;
private String description;
private String whopaidID;
private String whopaidName;
private Double amount;
private Map<String, UserFB> partecipants;
// setters and getters...
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
dest.writeString(description);
dest.writeString(whopaidID);
dest.writeString(whopaidName);
dest.writeMap(partecipants);
}
protected ExpenseFB(Parcel in) {
id = in.readString();
name = in.readString();
description = in.readString();
whopaidID = in.readString();
whopaidName = in.readString();
in.readMap(partecipants,UserFB.class.getClassLoader());
}
public static final Creator<ExpenseFB> CREATOR = new Creator<ExpenseFB>() {
@Override
public ExpenseFB createFromParcel(Parcel in) {
return new ExpenseFB(in);
}
@Override
public ExpenseFB[] newArray(int size) {
return new ExpenseFB[size];
}
};
}
UserFB:
public class UserFB implements Parcelable{
private String id;
private String name;
private String email;
private Map<String, GroupFB> groups;
private Map<String, UserFB> friends;
// setters and getters
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
dest.writeString(email);
dest.writeMap(groups);
dest.writeMap(friends);
}
protected UserFB(Parcel in) {
id = in.readString();
name = in.readString();
email = in.readString();
in.readMap(groups,GroupFB.class.getClassLoader());
in.readMap(friends,UserFB.class.getClassLoader());
}
public static final Creator<UserFB> CREATOR = new Creator<UserFB>() {
@Override
public UserFB createFromParcel(Parcel in) {
return new UserFB(in);
}
@Override
public UserFB[] newArray(int size) {
return new UserFB[size];
}
};
}
我希望通过将
ExpenseFB
对象添加到Intent中,在两个活动之间传递它。intent.putExtra("id", expenseFB);
当我在调试模式下执行getIntent().getParcelableExtra("id")
时,在第二个活动中,当尝试对partecipants
映射执行readMap()
方法时,会引发以下异常:
... Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.put(java.lang.Object, java.lang.Object)' on a null object reference
我发现第一个活动中的partecipants
映射已经被填充了:我认为问题在于writeMap()
方法中。
是否存在一种标准或更好的方法来传递包含映射的Parcelable
对象?
我需要调用另一个方法来打包映射吗?
我不想使用Serializable
对象,因为我读到它们会使性能变差。
Parcel
类已经有了writeMap()
和readMap()
方法,可以完美地实现这个功能。为什么不使用现有的方法呢?在这里没有必要重新发明轮子。 - David Wasser