Colisable Où / quand est-ce que describeContents () est utilisé?

93

Est-ce que quelqu'un sait où / quand cette méthode d'un Parcelable est appelée?

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

Il doit être annulé. Mais devrais-je envisager d'en faire quelque chose d'utile?

cody
la source
Il semble que personne n'ait une idée ..? : - /
cody

Réponses:

181

Il existe une constante définie dans Parcelablecalled CONTENTS_FILE_DESCRIPTORqui est destinée à être utilisée describeContents()pour créer une valeur de retour de masque de bits.

La description de CONTENTS_FILE_DESCRIPTORla référence API est:

Masques de bits à utiliser avec describeContents (): chaque bit représente un type d'objet considéré comme ayant une signification spéciale potentielle lorsqu'il est rassemblé.

Ce qui signifie vraiment: Si vous avez besoin de mettre l' FileDescriptorobjet en Parcelable vous devriez / devez spécifier CONTENTS_FILE_DESCRIPTORque la valeur de retour de describeContents (), soit par « objet spécial » (dans describeContents()la description) ils ont vraiment moyenne: FileDescriptor.

Toute cette fonctionnalité Parcelable semble inachevée (lire: a une mauvaise conception). Il y a une autre chose étrange dans la documentation:

Les classes implémentant l'interface Parcelable doivent également avoir un champ statique appelé CREATOR, qui est un objet implémentant l'interface Parcelable.Creator

Mettre en œuvre l'héritage multiple par des règles définies sous une forme lisible par l'homme? :-)

Il semble que le programmeur C ++ ait été conçu Parceableet à un moment donné, il s'est rendu compte: Oh, putain, il n'y a pas d'héritage multiple en Java ... :-)

Ognyan
la source
2
Merci pour cette explication détaillée. J'ai trouvé votre réponse après avoir été frustré par ce tutoriel affirmant qu'il describeContents()devrait renvoyer 0 chaque fois qu'il "n'a rien de spécial" . Ce qui n'explique vraiment rien. Votre explication est tellement plus claire!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
Il ne s'agit pas d'héritage multiple. Vous ne pouvez pas définir une méthode statique dans une interface Java, pas dans la version utilisée sous Android, d'où ce champ CREATOR.
Aleks N.27
1
@Ogre_BGR Je ne comprends toujours pas. Pouvez-vous montrer un exemple de code indiquant quand cela pourrait être utile?
développeur android
2
@androiddeveloper Je pense qu'il ne doit pas être utilisé dans le développement d'applications "normales". Il semble qu'il ne soit utilisé que par des méthodes natives afin de transmettre des informations entre les processus. Veuillez jeter un œil à InputChannel.java (classe décrivant le commentaire) et android_os_Parcel.cpp
Ognyan
7

Il n'y a que deux valeurs possibles, 0 ou CONTENTS_FILE_DESCRIPTOR

si vous sérialisez POLO, cette valeur doit toujours être 0, le CONTENTS_FILE_DESCRIPTOR est réservé à ParcelFileDescriptor , qui pourrait sérialiser un descripteur de fichier (FD) dans un système * unix.

bowman han
la source