活動

2017-04-18 12 views
5

我類ExpenseFB,它實現Parcelable之間含有地圖通行證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.putExtra("id", expenseFB); 

時,在調試模式下,我的第二個活動執行getIntent().getParcelableExtra("id")它引發以下異常時嘗試做​​方法partecipants圖:

... 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()方法中。
是否存在標準或更好的方法來傳遞包含Map的Parcelable對象?
我是否需要調用另一種方法來包裹Map?

我不想使用Serializable對象,因爲我讀到他們表現更差。

回答

4

的問題是,​​用於讀取從Parcel數據分成和現有Map。您在致電​​之前尚未創建Map,因此您獲得NullPointerException

您可以通過初始化地圖解決這個問題,當你把它聲明:

private Map<String, GroupFB> groups = new HashMap<String, GroupFB>(); 
private Map<String, UserFB> friends = new HashMap<String, UserFB>(); 

或者,您可以在UserFB構造函數創建空Map,像這樣:

protected UserFB(Parcel in) { 
    id = in.readString(); 
    name = in.readString(); 
    email = in.readString(); 
    groups = new HashMap<String, GroupFB>(); 
    in.readMap(groups,GroupFB.class.getClassLoader()); 
    friends = new HashMap<String, UserFB>() 
    in.readMap(friends,UserFB.class.getClassLoader()); 
} 
0

你得到了點,但我認爲你需要知道如何編寫Map<>parcelable

粘貼writeParcel()方法

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(this.groups.size()); 
    for (Map.Entry<String, GroupFb> entry : this.groups.entrySet()) { 
     dest.writeString(entry.getKey()); 
     dest.writeParcelable(entry.getValue(), flags); 
    } 
} 

protected UserFB (Parcel in) { 
    int groupsSize = in.readInt(); 
    this.groups = new HashMap<String, GroupFb>(groupsSize); 
    for (int i = 0; i < groupsSize; i++) { 
     String key = in.readString(); 
     GroupFb value = in.readParcelable(GroupFb.class.getClassLoader()); 
     this.groups.put(key, value); 
    } 
} 

執行相同的另一Map<>了。

+1

的'Parcel'類已經有一個'writeMap()'和'readMap()'方法來完成這個工作。爲什麼你不使用現有的方法?沒有理由在這裏重新發明輪子。 –