Paketierbar, wo / wann wird descriptionContents () verwendet?

93

Weiß jemand, wo / wann diese Methode eines Pakets aufgerufen wird?

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

Es muss überschrieben werden. Aber sollte ich darüber nachdenken, etwas Nützliches damit zu machen?

Cody
quelle
Es scheint, dass niemand eine Idee hat ..? : - /
Cody

Antworten:

181

In call ist eine Konstante definiert Parcelable, CONTENTS_FILE_DESCRIPTORdie describeContents()zum Erstellen eines Bitmasken-Rückgabewerts verwendet werden soll.

Beschreibung für CONTENTS_FILE_DESCRIPTORin der API-Referenz lautet:

Bitmasken zur Verwendung mit descriptionContents (): Jedes Bit stellt eine Art Objekt dar, das beim Marshalling eine potenzielle besondere Bedeutung hat.

Was wirklich bedeutet: Wenn Sie ein FileDescriptorObjekt in Parcelable einfügen müssen, sollten / müssen Sie CONTENTS_FILE_DESCRIPTORals Rückgabewert von descriptionContents () angeben , dh mit " Spezialobjekt " (in describeContents()der Beschreibung) meinen sie wirklich : FileDescriptor.

Diese gesamte Parcelable- Funktionalität sieht unvollendet aus (lesen Sie: hat schlechtes Design). Es gibt noch eine andere seltsame Sache in den Dokumenten:

Klassen, die die Parcelable-Schnittstelle implementieren, müssen auch ein statisches Feld namens CREATOR haben, ein Objekt, das die Parcelable.Creator-Schnittstelle implementiert

Mehrfachvererbung durch Regeln implementieren, die in lesbarer Form definiert sind? :-)

Es scheint, als hätte ein C ++ - Programmierer entworfen Parceableund irgendwann wurde ihm klar: Oh, verdammt, es gibt keine Mehrfachvererbung in Java ... :-)

Ognyan
quelle
2
Vielen Dank für diese ausführliche Erklärung. Ich fand Ihre Antwort, nachdem ich von diesem Tutorial frustriert war, das behauptete, dass describeContents()0 zurückgegeben werden sollte, wenn es "nichts Besonderes an sich hat" . Was eigentlich nichts erklärt. Ihre Erklärung ist so viel klarer!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
Es geht nicht um Mehrfachvererbung. Sie können keine statische Methode in einer Java-Schnittstelle definieren, nicht in der in Android verwendeten Version, daher dieses CREATOR-Feld.
Aleks N.
1
@Ogre_BGR Ich verstehe es immer noch nicht. Vielleicht können Sie einen Beispielcode zeigen, wann er nützlich sein könnte?
Android-Entwickler
2
@androiddeveloper Ich denke, dass es nicht erwähnt wird, in der "normalen" App-Entwicklung verwendet zu werden. Es scheint, dass es nur von nativen Methoden verwendet wird, um Informationen zwischen Prozessen zu übertragen. Bitte werfen Sie einen Blick auf InputChannel.java (Klasse beschreibt Kommentar) und android_os_Parcel.cpp
Ognyan
7

Es gibt nur zwei mögliche Werte, 0 oder CONTENTS_FILE_DESCRIPTOR

Wenn Sie POLO serialisieren, sollte dieser Wert immer 0 sein. Der CONTENTS_FILE_DESCRIPTOR ist für ParcelFileDescriptor reserviert , wodurch ein File Descriptor (FD) im * Unix-System serialisiert werden kann.

Bogenschütze Han
quelle