2017-03-17 87 views
0

這是Android implement Parcelable object which has hashmap的一個擴展,但我的實驗有點不同。Android實現包含另一個散列映射的包含散列映射的可包含對象

我有這些類

public class EventDetails implements Parcelable { 
    Private String id; 
    Private String eventName; 
    Private Long eventUnixTime; 
    Private HashMap <String, User> pickedUser = null; 
} 

public class User implements Parcelable { 
    private String email; 
    private String userName; 
    private String userPicture; 
    private Boolean hasLoggedInWithPassword; 
    private HashMap<String, Object> dateJoined = null; 

    public User() { 

    } 

    public User(String email, String userName, String userPicture, Boolean hasLoggedInWithPassword, HashMap<String, Object> dateJoined) { 
     this.email = email; 
     this.userName = userName; 
     this.userPicture = userPicture; 
     this.hasLoggedInWithPassword = hasLoggedInWithPassword; 
     this.dateJoined = dateJoined; 
    } 

    protected User(Parcel in) { 
     email = in.readString(); 
     userName = in.readString(); 
     userPicture = in.readString(); 

     int size = in.readInt(); 
     for (int i = 0; i < size; i++) { 
      String key = in.readString(); 
      Object value = in.readString(); 
      dateJoined.put(key, value); 
     } 
    } 

    public static final Creator<User> CREATOR = new Creator<User>() { 
     @Override 
     public User createFromParcel(Parcel in) { 
      return new User(in); 
     } 

     @Override 
     public User[] newArray(int size) { 
      return new User[size]; 
     } 
    }; 

    public String getEmail() { 
     return email; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public String getUserPicture() { 
     return userPicture; 
    } 

    public Boolean getHasLoggedInWithPassword() { 
     return hasLoggedInWithPassword; 
    } 

    public HashMap<String, Object> getDateJoined() { 
     return dateJoined; 
    } 

    @Override 
    public int describeContents() { 
     Log.i("describeUser", "describe content from User.java"); 

     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 

     Log.i("write to Parcel", "write to Parcel from User.java"); 
     dest.writeString(email); 
     dest.writeString(userName); 
     dest.writeString(userPicture); 
     dest.writeInt(hasLoggedInWithPassword ? 1:0); 

     dest.writeInt(dateJoined.size()); 
     for (HashMap.Entry<String, Object> entry : dateJoined.entrySet()) { 
      dest.writeString(entry.getKey()); 
      dest.writeString(String.valueOf(entry.getValue())); 
     } 
    } 
} 

我被困在EventDetails類這些方法:

protected EventDetails(Parcel in) { 
    id = in.readString(); 
    eventName = in.readString(); 
    eventUnixTime = in.readLong(); 

    final int size = in.readInt(); 
    for (int i = 0; i < size; i++) { 
     String key = in.readString(); 
     User user = in.readHashMap(userMap); 
     pickedFriendsHashMap.put(key, user); 
    } 
} 

@Override 
    public void writeToParcel(Parcel dest, int flags) { 

     dest.writeInt(pickedFriendsHashMap.size()); 

     for (HashMap.Entry<String, User> entry : pickedFriendsHashMap.entrySet()) { 
      dest.writeString(entry.getKey()); 

     dest.writeInt(listLength); 

     for (User user: userList) { 
      dest.writeParcelable(user, 0); 
     } 
    } 

    dest.writeString(id); 
    dest.writeString(eventName); 
    dest.writeLong(eventUnixTime); 
} 

請告知我怎樣才能正確地把這些包裹中的課程並捆綁發送。

謝謝。

-R

+1

嘗試使用代替Parcelable序列化。 –

+0

@HareshChhelana爲什麼可序列化? –

+2

@RissmonSuresh不需要編寫代碼進行編組和解組。 –

回答

1

的Android工作室已經提供插件(Android Parcelable code generator)自動生成Parcelable方法。

對於使用上述插件我已創建下面的類與Parcelable自動生成的方法

public class EventDetails implements Parcelable { 

    private String id; 
    private String eventName; 
    private Long eventUnixTime; 
    private HashMap<String, User> pickedUser; 


    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.id); 
     dest.writeString(this.eventName); 
     dest.writeValue(this.eventUnixTime); 
     dest.writeSerializable(this.pickedUser); 
    } 

    public EventDetails() { 
    } 

    protected EventDetails(Parcel in) { 
     this.id = in.readString(); 
     this.eventName = in.readString(); 
     this.eventUnixTime = (Long) in.readValue(Long.class.getClassLoader()); 
     this.pickedUser = (HashMap<String, User>) in.readSerializable(); 
    } 

    public static final Creator<EventDetails> CREATOR = new Creator<EventDetails>() { 
     @Override 
     public EventDetails createFromParcel(Parcel source) { 
      return new EventDetails(source); 
     } 

     @Override 
     public EventDetails[] newArray(int size) { 
      return new EventDetails[size]; 
     } 
    }; 
} 

public class User implements Parcelable { 
    private String email; 
    private String userName; 
    private String userPicture; 
    private Boolean hasLoggedInWithPassword; 
    private HashMap<String, Object> dateJoined = null; 

    public User(String email, String userName, String userPicture, Boolean hasLoggedInWithPassword, HashMap<String, Object> dateJoined) { 
     this.email = email; 
     this.userName = userName; 
     this.userPicture = userPicture; 
     this.hasLoggedInWithPassword = hasLoggedInWithPassword; 
     this.dateJoined = dateJoined; 
    } 


    public String getEmail() { 
     return email; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public String getUserPicture() { 
     return userPicture; 
    } 

    public Boolean getHasLoggedInWithPassword() { 
     return hasLoggedInWithPassword; 
    } 

    public HashMap<String, Object> getDateJoined() { 
     return dateJoined; 
    } 


    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.email); 
     dest.writeString(this.userName); 
     dest.writeString(this.userPicture); 
     dest.writeValue(this.hasLoggedInWithPassword); 
     dest.writeSerializable(this.dateJoined); 
    } 

    protected User(Parcel in) { 
     this.email = in.readString(); 
     this.userName = in.readString(); 
     this.userPicture = in.readString(); 
     this.hasLoggedInWithPassword = (Boolean) in.readValue(Boolean.class.getClassLoader()); 
     this.dateJoined = (HashMap<String, Object>) in.readSerializable(); 
    } 

    public static final Creator<User> CREATOR = new Creator<User>() { 
     @Override 
     public User createFromParcel(Parcel source) { 
      return new User(source); 
     } 

     @Override 
     public User[] newArray(int size) { 
      return new User[size]; 
     } 
    }; 
} 
+0

謝謝Haresh。我會試試這個。 – runrmrf

+1

這是不正確的,它將在編組時拋出一個'java.io.NotSerializableException'。你的User類沒有實現Serializable。如果對象的一部分不是可序列化的(即'用戶'),則不能指望編寫可序列化的對象。 此外,你不能簡單地''用戶'實現'Serializable'並期望它的工作。您將需要使用不同的數據結構(例如'List '),否則您將需要自行處理從/到/到一個Parcel的讀寫。 – w3bshark