2014-07-21 53 views
3

我在服務創建過程中編組時遇到了一個簡單的疑問。如果在Parcelable接口中聲明的writeToParcel()方法中聲明的接口(如果aidl方法參數聲明爲in),爲什麼在Parcelable接口中沒有readFromParcel()聲明(對於out參數)?在Parcelable接口中的readFromParcel()方法

我可以創建自己的readFromParcel()但按我的理解,如果生成的樁要調用它應該有Parcelable接口覆蓋readFromParcel()聲明。但Parcelable interface的文檔沒有顯示readFromParcel()方法的任何符號。爲什麼這樣?它是否包含在以前的API版本中,並在以後被刪除?請解釋 !

如果readFromParcel()和readFromParcel()兩者都嘗試讀取parcelable對象並使用其中的數據填充成員字段,那麼它們有何區別?

+0

'readFromParcel'需要預先創建的對象,而'createFromParcel'直接從包裹中返回一個新實例化的對象。這是因爲,當一個'Parcelable'類型實例被用作'out'或'inout'參數時,Binder子系統在概念上首先創建一個空對象,然後在返回響應時用'readFromParcel'填充它。 – scorpiodawg

回答

2

createFromParcel正是它聽起來像。已創建已寫入包裹的可分段對象/類的新實例:Parcelable.writeToParcel()已創建。這是一件好事,因爲它可以幫助防止內存泄漏,因爲你不是抱着一種從可能會或可能不會被破壞

+0

readFromParcel呢?爲什麼它作爲存根生成的一部分被調用?任何見解? –

+0

通常你從構造函數中調用它..不知道我理解你的問題 – erik

1

Parcelable interface文檔另一個類對象的引用:

public class MyParcelable implements Parcelable { 
private int mData; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

public static final Parcelable.Creator<MyParcelable> CREATOR 
     = new Parcelable.Creator<MyParcelable>() { 
    public MyParcelable createFromParcel(Parcel in) { 
     return new MyParcelable(in); 
    } 

    public MyParcelable[] newArray(int size) { 
     return new MyParcelable[size]; 
    } 
}; 

private MyParcelable(Parcel in) { 
    mData = in.readInt(); 
} 
} 

當實現Parcelable接口的類的對象要寫入Parcel時,調用writeToParcel(...)

當要使用包創建此類的對象時,將調用CREATOR.createFromParcel(Parcel in)。從那裏開始,班級如何從包裹創建它的實例取決於班級的開發人員。在上例中,從createFromParcel(...)方法調用構造函數private MyParcelable(Parcel in)

傳統上,許多開發商在它們的實現定義readFromParcel(Parcel in)方法和構造函數調用它:

private MyParcelable(Parcel in) { 
    readFromParcel(in); 
} 

private void readFromParcel(Parcel in) { 
    mData = in.readInt(); 
} 
2

這是因爲你已經宣佈類型在AIDL「INOUT」的參數。

當從該方法返回時,生成的AIDL代理將調用readFromParcel()來更新參數值(由「inout」限定符定義)。

+0

這個問題可能是錯誤的措詞,但我相信這個答案是正確的。在界面中沒有'readFromParcel',可能並不是每個人都需要他們的'Parcelable'作爲'out'或'inout'參數。這可以通過將Parcelable設置爲抽象類來解決(或者如果Android使用默認方法移動到Java 8)。 – scorpiodawg