2011-01-24 14 views
57

Eventuali duplicati:
Parcelable where/when is describeContents() used?Scopo del describeContents() dell'interfaccia Parcelable

Qual è lo scopo della describeContents attuazione (funzione) dell'interfaccia Parcelable? La maggior parte del codice framework restituisce 0 come implementazione. La documentazione dice "una maschera di bit che indica l'insieme di tipi di oggetti speciali convalidati da Parcelable". Qualcuno potrebbe spiegare questa funzione (probabilmente con un esempio)

risposta

9

Può succedere che la classe abbia classi figlio, quindi ogni bambino in questo caso può restituire valori describeContent() diversi, in modo da sapere quale tipo di oggetto specifico creare da Parcel. Per esempio come qui - esempio di implementazione di Parcelable metodi nella classe genitore (MyParent):

//************************************************ 
// Parcelable methods 
//************************************************ 
//need to be overwritten in child classes 
//MyChild_1 - return 1 and MyChild_2 - return 2 
public int describeContents() {return 0;} 

public void writeToParcel(Parcel out, int flags) 
{ 
    out.writeInt(this.describeContents()); 
    out.writeSerializable(this); 
} 

public Parcelable.Creator<MyParent> CREATOR 
     = new Parcelable.Creator<MyParent>() 
{ 
    public MyParent createFromParcel(Parcel in) 
    { 
     int description=in.readInt(); 
     Serializable s=in.readSerializable(); 
     switch(description) 
     { 
      case 1: 
       return (MyChild_1)s; 
      case 2: 
       return (MyChild_2)s; 
      default: 
       return (MyParent)s; 
     } 
    } 

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

In questo caso non c'è bisogno di attuare tutte Parcelable metodi in classi figlie - tranne describeContent()

+8

Questa risposta è Non corretto. L'approccio 'Serializable' funzionerebbe anche senza l'uso di describeContents(). Si utilizza il valore per trasmettere un oggetto deserializzato a MyParent o a una delle sue sottoclassi. Ma il tipo di ritorno di createFromParcel() è MyParent, quindi potresti semplicemente castato su MyParent in tutti i casi, ignorando il valore della descrizione. – devconsole

+19

Risposta corretta: [Parcelable where/when is describeContents() utilizzato?] (Http://stackoverflow.com/questions/4076946/parcelable-where-when-is-describecontents-used/4914799#4914799) – devconsole

+0

No !! Come altri hanno già detto, questo non è corretto. Android Studio fornirà effettivamente un errore del compilatore. Il valore deve essere 0 o "CONTENTS_FILE_DESCRIPTOR" in base ai documenti ufficiali: https://developer.android.com/reference/android/os/Parcelable.html#describeContents() – HughHughTeotl