Parcelable ¿dónde / cuándo se usa describeContents ()?

93

¿Alguien sabe dónde / cuándo se llama este método de Parcelable ?

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

Tiene que anularse. ¿Pero debería considerar hacer algo útil con él?

cody
fuente
Parece que nadie tiene una idea ..? : - /
cody

Respuestas:

181

Hay una constante definida en la Parcelablellamada CONTENTS_FILE_DESCRIPTORque está destinada a ser utilizada describeContents()para crear un valor de retorno de máscara de bits.

La descripción de CONTENTS_FILE_DESCRIPTORla API ref es:

Máscaras de bits para usar con describeContents (): cada bit representa un tipo de objeto que se considera que tiene un significado especial potencial cuando se calcula.

Que en realidad significa: Si usted necesita poner FileDescriptorobjeto en parcelable debe / debe especificar CONTENTS_FILE_DESCRIPTORcomo valor de retorno de describeContents (), es decir, por " objeto especial " (en la describeContents()descripción 's) que realmente quieren decir: FileDescriptor.

Toda esta funcionalidad Parcelable parece inacabada (léase: tiene un mal diseño). Hay otra cosa extraña en los documentos:

Las clases que implementan la interfaz Parcelable también deben tener un campo estático llamado CREATOR, que es un objeto que implementa la interfaz Parcelable.Creator

¿Implementando herencia múltiple mediante reglas definidas en forma legible por humanos? :-)

Parece que el programador de C ++ lo diseñó Parceabley en algún momento se dio cuenta: Oh, maldita sea, no hay herencia múltiple en Java ... :-)

Ognyan
fuente
2
Gracias por esta explicación detallada. Encontré su respuesta después de sentirme frustrado por este tutorial que afirma que describeContents()debería devolver 0 siempre que "no tenga nada especial" . Lo que realmente no explica nada. ¡Tu explicación es mucho más clara!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
No se trata de herencia múltiple. No se puede definir un método estático en una interfaz Java, no en la versión utilizada en Android, de ahí este campo CREADOR.
Aleks N.
1
@Ogre_BGR Todavía no lo entiendo. ¿Quizás puede mostrar un código de ejemplo de cuándo podría ser útil?
desarrollador de Android
2
@androiddeveloper Creo que no debe usarse en el desarrollo de aplicaciones "normales". Parece que solo lo utilizan métodos nativos para pasar información entre procesos. Por favor, eche un vistazo a InputChannel.java (clase que describe el comentario) y android_os_Parcel.cpp
Ognyan
7

Solo hay dos valores posibles, 0 o CONTENTS_FILE_DESCRIPTOR

si está serializando POLO, este valor siempre debe ser 0, el CONTENTS_FILE_DESCRIPTOR está reservado para ParcelFileDescriptor , que podría serializar un Descriptor de archivo (FD) en un sistema * unix.

arquero han
fuente