筆者在進行頁面跳轉時,要傳遞一個實體類,但是這個實體類有一個bitmap屬性,在傳遞這個對象時報錯,查詢資料之後發現需要對實體類進行序列化。實現序列化有以下兩種方法:
- 第一個是使用Serializable接口,這個接口是Java SE本身就支持的序列化接口,但是使用這個接口來進行Intent數據的傳遞有一個缺點。因爲這個序列化和反序列化過程中需要大量I/O操作,從而導致開銷大效率低。
- 第二個是使用Parcelable接口的使用,也就是本篇文章的主要重點。這種方式是Android中支持的序列化方式,使用起來稍微麻煩點,但是效率更高,所以我們一般使用這個方式來通過Intent傳遞數據。
第一種方式只需要在類後面加上implements Serializable即可,但是筆者在實現過程中發現只能解決一小部分問題,還是第二種方法更好實現。
這裏的各種類型比較全,可以做相對參考。下面貼上代碼:
public class Worker implements Parcelable {
public String name;
public int age;
public Programmer programmer;
public ArrayList<Programmer> pros = new ArrayList<Programmer>();
public Bitmap icon;
public Designer designer;
public Worker() {}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(name);
out.writeInt(age);
out.writeParcelable(programmer, flags);
out.writeList(pros);
out.writeParcelable(icon, flags);
out.writeSerializable(designer);
}
public static final Parcelable.Creator<Worker> CREATOR
= new Parcelable.Creator<Worker>() {
public Worker createFromParcel(Parcel in) {
return new Worker(in);
}
public Worker[] newArray(int size) {
return new Worker[size];
}
};
private Worker(Parcel in) {
name = in.readString();
age = in.readInt();
programmer = in.readParcelable(Programmer.class.getClassLoader()); // 這個地方的ClassLoader不能爲null
pros = in.readArrayList(Programmer.class.getClassLoader()); // 這個地方的ClassLoader不能爲null
icon = in.readParcelable(null); // 這個地方可以爲null
designer = (Designer) in.readSerializable();
}
}