2017-04-18 17 views
5

मेरी कक्षा ExpenseFB, जो Parcelable लागू करता है के बीच मानचित्र युक्त वस्तु, शामिल UserFB के Map (जो Parcelable भी लागू करता है):

ExpenseFB:पास parcelable गतिविधि

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

मैं ऑब्जेक्ट जोड़कर दो क्रियाओं के बीच एक एक्सपेंसएफबी ऑब्जेक्ट पास करना चाहता हूंआशय के लिए:

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

मैं:

intent.putExtra("id", expenseFB); 

है, डिबग मोड में, मैं दूसरी गतिविधि में getIntent().getParcelableExtra("id") निष्पादित जब कोशिश करता partecipants नक्शे पर readMap() विधि करने के लिए यह निम्न अपवाद को जन्म देती है देखें कि partecipants पहली गतिविधि में नक्शा भरा गया है: मुझे लगता है कि समस्या लिखने में है() विधि।
Parcelable ऑब्जेक्ट को मानचित्र रखने के लिए मानक या बेहतर तरीका मौजूद है?
क्या मुझे मानचित्र को पार्सल करने के लिए एक और तरीका कॉल करना है?

मैं Serializable ऑब्जेक्ट का उपयोग नहीं करना चाहता क्योंकि मैंने पढ़ा है कि वे खराब प्रदर्शन करते हैं।

उत्तर

4

समस्या यह है कि readMap()में एक Parcel से डेटा पढ़ने के लिए इस्तेमाल किया और मौजूदा Map जाता है। readMap() पर कॉल करने से पहले आपने 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() 'विधि है जो वास्तव में ऐसा करती है। आप मौजूदा विधि का उपयोग क्यों नहीं करेंगे? यहां पहिया को फिर से शुरू करने का कोई कारण नहीं है। –

संबंधित मुद्दे