Parcelable简单的数据传递就不在此另加介绍了,请移步:Android中Parcelable接口用法
这里主要介绍下Parcelable传递复杂对象的使用方法:
假设我们有一个这样结构的类:
public class Data implements Parcelable {
public int practice_id;
public LinkedHashMap<Integer, ArrayList<PracticeBean>> questions;
public Data(int practice_id, LinkedHashMap<Integer, ArrayList<PracticeBean>> questions) {
this.practice_id = practice_id;
this.questions = questions;
}
public Data() {
}
protected Data(Parcel in) {
practice_id = in.readInt();
// 读取之前写入的size
int size = in.readInt();
if(questions == null){
questions = new LinkedHashMap<>();
}
for (int i = 0 ;i < size ;i++) {
Integer key = in.readInt();
ArrayList<PracticeBean> value = in.readArrayList(PracticeBean.class.getClassLoader());
questions.put(key, value);
}
}
public static final Creator<Data> CREATOR = new Creator<Data>() {
@Override
public Data createFromParcel(Parcel in) {
return new Data(in);
}
@Override
public Data[] newArray(int size) {
return new Data[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(practice_id);
// 将LinkedHashMap的大小写进内存,供解析的时候使用
/*
这里采用循环写入的方式,之后读取也需要采取相同的协议解析即可
*/
parcel.writeInt(questions.size());
for (LinkedHashMap.Entry<Integer, ArrayList<PracticeBean>> entry : questions.entrySet()) {
parcel.writeInt(entry.getKey());
parcel.writeList(entry.getValue());
}
}
@Override
public String toString() {
return "Data{" +
"practice_id=" + practice_id +
", questions=" + questions +
'}';
}
}
这里说明下,使用LinkedHashMap的目的是在解析出来之后保持之前的顺序。
主要的思想是:
按照一定的协议,将复杂的对象分解为简单的对象直到可以直接使用parcel的实例方法写进内存,然后读取的时候按照相同的协议解析。
参考:http://stackoverflow.com/questions/8254654/how-write-java-util-map-into-parcel-in-a-smart-way