Parcelable di mana / kapan deskripsinya digunakan?

93

Adakah yang tahu di mana / kapan metode Parcelable ini dipanggil?

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

Itu harus diganti. Tetapi haruskah saya mempertimbangkan untuk melakukan sesuatu yang berguna dengannya?

cody
sumber
Sepertinya tidak ada yang punya ide ..? : - /
cody

Jawaban:

181

Ada konstanta yang didefinisikan dalam Parcelablepemanggilan CONTENTS_FILE_DESCRIPTORyang dimaksudkan untuk digunakan dalam describeContents()membuat nilai kembalian bitmask.

Deskripsi CONTENTS_FILE_DESCRIPTORdi ref API adalah:

Masker bit untuk digunakan dengan descriptionContents (): setiap bit mewakili jenis objek yang dianggap memiliki signifikansi khusus potensial ketika disusun.

Yang benar-benar berarti: Jika Anda perlu menempatkan FileDescriptorobjek ke dalam Parcelable Anda harus / harus menentukan CONTENTS_FILE_DESCRIPTORsebagai nilai kembali dari describeContents (), yaitu dengan " objek khusus " (di describeContents()'s description) mereka benar-benar berarti: FileDescriptor.

Seluruh fungsi Parcelable ini terlihat belum selesai (baca: desainnya jelek). Ada satu hal aneh lainnya di dokumen:

Kelas yang menerapkan antarmuka Parcelable juga harus memiliki bidang statis yang disebut CREATOR, yang merupakan objek yang mengimplementasikan antarmuka Parcelable.Creator

Menerapkan banyak warisan dengan aturan yang ditentukan dalam bentuk yang dapat dibaca manusia? :-)

Sepertinya programmer C ++ dirancang Parceabledan pada titik tertentu dia menyadari: Oh, sial, tidak ada banyak warisan di Java ... :-)

Ognyan
sumber
2
Terima kasih atas penjelasan mendetail ini. Saya menemukan jawaban Anda setelah dibuat frustrasi oleh tutorial ini yang mengklaim bahwa describeContents()harus mengembalikan 0 setiap kali "tidak ada yang istimewa tentang itu" . Yang tidak menjelaskan apapun. Penjelasan Anda jauh lebih jelas!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
Ini bukan tentang warisan berganda. Anda tidak dapat menentukan metode statis dalam antarmuka Java, bukan dalam versi yang digunakan di Android, karenanya bidang CREATOR ini.
Aleks N.
1
@Ogrejat aku masih belum mengerti. Mungkin dapatkah Anda menunjukkan kode contoh kapan itu bisa berguna?
pengembang android
2
@androiddeveloper Saya rasa tidak perlu digunakan dalam pengembangan aplikasi "normal". Sepertinya itu hanya digunakan oleh metode asli untuk meneruskan informasi antar proses. Silakan lihat di InputChannel.java (komentar yang menjelaskan kelas) dan android_os_Parcel.cpp
Ognyan
7

Hanya ada dua nilai yang mungkin, 0 atau CONTENTS_FILE_DESCRIPTOR

jika Anda membuat serial POLO, nilai ini harus selalu 0, CONTENTS_FILE_DESCRIPTOR dicadangkan untuk ParcelFileDescriptor , yang dapat membuat serialisasi File Descriptor (FD) di sistem * unix.

pemanah han
sumber