前言
引用地址 Android面試一天一題(9 Day)
Parcelable 模板
public class Book implements Parcelable {
private int bookId;
private String bookName;
private List<String> mdatas;
protected Book(Parcel in) {
bookId = in.readInt();
bookName = in.readString();
mdatas = in.createStringArrayList();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(bookId);
dest.writeString(bookName);
dest.writeStringList(mdatas);
}
}
問題
- Parcelable和Serializable的區(qū)別:
Serializalbe會使用反射痴昧,序列化和反序列化過程需要大量I/O操作谷市,Parcelable自已實現(xiàn)封送和解封(marshalled &unmarshalled)操作不需要用反射椿浓,數(shù)據(jù)也存放在Native內(nèi)存中雪侥,效率要快很多。
- Parcelable 和Parcel這兩者之間的關(guān)系。
Parcelable 接口定義在封送/解封送過程中混合和分解對象的契約。Parcelable接口的底層是Parcel容器對象缚忧。Parcel類是一種最快的序列化/反序列化機(jī)制,專為Android中的進(jìn)程間通信而設(shè)計杈笔。該類提供了一些方法來將成員容納到容器中闪水,以及從容器展開成員。
- 在兩個Activity之前傳遞對象還要注意什么呢蒙具?
一定要要注意對象的大小球榆,Intent中的Bundle是在使用Binder機(jī)制進(jìn)行數(shù)據(jù)傳遞的,能使用的Binder的緩沖區(qū)是有大小限制的(有些手機(jī)是2M)禁筏,而一個進(jìn)程默認(rèn)有16個binder線程持钉,所以一個線程能占用的緩沖區(qū)就更小了(以前做過測試,大約一個線程可以占用128KB)篱昔。所以當(dāng)你看到“The Binder transaction failed because it was too large.”這類TransactionTooLargeException異常時每强,你應(yīng)該知道怎么解決了。因此州刽,使用Intent在Activity之間傳遞List和Bitmap對象是有風(fēng)險的空执。
總結(jié)
能使用的Parcelable的地方,請不要貪圖簡便直接Serializable穗椅,實在懶的話也可以試試用插件自動生成Pracelabel的模板代碼:android-parcelable-intellij-plugin 試了一下脆烟,so easy!誰用誰知道