Android Intent (2) Serializable vs Parcelable

Android 主要是經過Intent來實現組件之間的相互調用,同時還能夠傳遞附加的數據。這些數據主要是存儲在Bundle之中(當調用Intent.putExtras(Bundle)時,Android會複製Bundle中的數據,而不是引用,所以再修改Bundle中的數據並不會改變Intent中攜帶的數據)。 java

Bundle之中能夠存放基本數據類型以及實現了Serializable或Parcelable接口的類。 ide

當咱們要向Bundle中存放一個類Obj(包含兩個int成員的簡單類),能夠讓它實現Serializable或Parcelable接口,以下所示: 性能

1.Serializable 測試

public class Obj implements Serializable {
	private int a;
	private int b;
	public Obj(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	@Override
	public String toString() {
		return "Obj: [" + a + ", " + b + "]";
	}
}
咱們能夠經過intent.putExtra("obj", new Obj(1, 2));來將其放入intent中,而後經過 obj = (Obj) intent.getSerializableExtra("obj");來將其取出。

2.Parcelable 網站

public class ObjPar implements Parcelable {
	private int a;
	private int b;
	public ObjPar(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	@Override
	public String toString() {
		return "Obj: [" + a + ", " + b + "]";
	}
	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(a);
		dest.writeInt(b);
	}
	
	public static final Parcelable.Creator<ObjPar> CREATOR = new Creator<ObjPar>() {
		
		@Override
		public ObjPar[] newArray(int size) {
			return new ObjPar[size];
		}
		
		@Override
		public ObjPar createFromParcel(Parcel source) {
			
			return new ObjPar(source.readInt(), source.readInt());
		}
	};
}
咱們能夠經過intent.putExtra("objpar", new ObjPar(1, 2));來將其放入intent中,而後經過 objpar =  (ObjPar) intent.getParcelableExtra("objpar"); 來將其取出。

以上是兩種向Bundle中存放Object對象的方法,明顯能夠看出實現Serializable接口更加簡單,由於他是一個標記性的接口,並不須要實現某個具體方法。相比而言實現Parcelable接口就顯得相對複雜一些,但這樣帶來的好處是性能的大幅提升。這是由於當咱們實現Serializable接口後,真正的序列化工做是由JDK來完成,他須要經過反射來獲取成員變量,由於反射的性能並不高,所以這種序列化方式速度慢。然而實現Parcelable接口時,咱們提供了該接口中定義方法的實現(writeToParcel實現序列化,createFromParcel實現反序列化),這就避免了反射的使用,所以這種方式速度快。 this

那麼這兩種方式,性能差異有多大呢?下面是國外網站上的一個測試結果:Serializable耗時是Parcelable的10倍左右 spa

相關文章
相關標籤/搜索