Parcelable dove / quando viene utilizzato descri- vents ()?


93

Qualcuno sa dove / quando viene chiamato questo metodo di un Parcelable ?

@Override
public int describeContents() {
    return 0;
}

Deve essere ignorato. Ma dovrei considerare di fare qualcosa di utile con esso?


Sembra che nessuno abbia un'idea ..? : - /
cody

Risposte:


181

C'è una costante definita in Parcelablechiamato CONTENTS_FILE_DESCRIPTORche deve essere utilizzata describeContents()per creare il valore di ritorno della maschera di bit.

La descrizione per CONTENTS_FILE_DESCRIPTORnel riferimento API è:

Maschere di bit da utilizzare con descrivereContents (): ogni bit rappresenta un tipo di oggetto considerato avere un potenziale significato speciale quando viene eseguito il marshalling.

Che in realtà significa: se è necessario mettere FileDescriptoroggetto in Parcelable si dovrebbe / necessario specificare CONTENTS_FILE_DESCRIPTORcome valore di ritorno di describeContents (), vale a dire da " oggetto speciale " (nella describeContents()descrizione 's) che veramente dire: FileDescriptor.

L'intera funzionalità di Parcelable sembra incompleta (leggi: ha un cattivo design). C'è un'altra cosa strana nei documenti:

Le classi che implementano l'interfaccia Parcelable devono anche avere un campo statico chiamato CREATOR, che è un oggetto che implementa l'interfaccia Parcelable.Creator

Implementazione dell'ereditarietà multipla mediante regole definite in forma leggibile dall'uomo? :-)

Sembra che il programmatore C ++ abbia progettato Parceablee ad un certo punto si è reso conto: Oh, dannazione, non esiste un'ereditarietà multipla in Java ... :-)


2
Grazie per questa spiegazione dettagliata. Ho trovato la tua risposta dopo essere stato frustrato da questo tutorial sostenendo che describeContents()dovrebbe restituire 0 ogni volta che "non ha niente di speciale" . Il che non spiega davvero nulla. La tua spiegazione è molto più chiara!
WebViewer

1
@LeoLink android.os.ParcelFileDescriptor
Ognyan

7
Non si tratta di eredità multipla. Non è possibile definire un metodo statico in un'interfaccia Java, non nella versione utilizzata in Android, quindi questo campo CREATOR.
Aleks N.

1
@Ogre_BGR Continuo a non capirlo. Forse puoi mostrare un codice di esempio di quando potrebbe essere utile?
sviluppatore Android

2
@androiddeveloper Penso che non sia da utilizzare nello sviluppo di app "normali". Sembra che sia utilizzato solo dai metodi nativi per trasferire le informazioni tra i processi. Dai un'occhiata a InputChannel.java (classe che descrive il commento) e android_os_Parcel.cpp
Ognyan

7

Sono disponibili solo due valori possibili, 0 o CONTENTS_FILE_DESCRIPTOR

se stai serializzando POLO, questo valore dovrebbe sempre essere 0, CONTENTS_FILE_DESCRIPTOR è riservato a ParcelFileDescriptor , che potrebbe serializzare un descrittore di file (FD) nel sistema * unix.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.