2017-04-18 16 views
5

Lớp học của tôi ExpenseFB, mà thực hiện Parcelable, chứa một Map của UserFB (mà thực hiện Parcelable quá):

ExpenseFB:đèo đối tượng parcelable chứa đồ giữa Hoạt động

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]; 
    } 
}; 
} 

Tôi muốn chuyển đối tượng ExpenseFB giữa hai Hoạt động bằng cách thêm đối tượng ExpenseFB đến mục đích:

intent.putExtra("id", expenseFB); 

Khi nào, trong chế độ gỡ lỗi, tôi thực hiện getIntent().getParcelableExtra("id") trong hoạt động thứ hai nó làm tăng ngoại lệ sau khi cố gắng để làm phương pháp readMap() trên partecipants bản đồ:

... 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 

tôi thấy rằng bản đồ partecipants trong hoạt động đầu tiên được điền: Tôi nghĩ rằng vấn đề nằm trong phương thức writeMap().
Có tồn tại cách tiêu chuẩn hoặc tốt hơn để chuyển đối tượng Parcelable có chứa Bản đồ không?
Tôi có phải gọi một phương pháp khác để chuyển bưu kiện cho Bản đồ không?

Tôi không muốn sử dụng đối tượng Serializable vì tôi đọc rằng chúng biểu diễn kém hơn.

Trả lời

4

Vấn đề là readMap() được sử dụng để đọc dữ liệu từ một Parcel vào và hiện Map. Bạn chưa tạo số Map trước khi gọi readMap(), vì vậy bạn nhận được NullPointerException.

Bạn có thể giải quyết điều này bằng cách khởi tạo bản đồ khi bạn khai báo nó:

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

Hoặc, bạn có thể tạo ra các sản phẩm nào Map trong constructor UserFB, như thế này:

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

Bạn có những điểm nhưng tôi nghĩ rằng bạn cần phải biết làm thế nào để viết Map<> vào parcelable

dán writeParcel() phương pháp

@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); 
    } 
} 

Làm tương tự cho Map<> khác quá.

+1

Lệnh 'Parcel' lớp đã có phương thức 'writeMap()' và 'readMap()' thực hiện chính xác điều này. Tại sao bạn không sử dụng phương pháp hiện có? Không có lý do gì để phát minh lại bánh xe ở đây. –

Các vấn đề liên quan