Parcelable ở đâu / khi nào thì descriptionContents () được sử dụng?


93

Có ai biết nơi / khi phương thức này của một Parcelable được gọi không?

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

Nó phải được ghi đè. Nhưng tôi có nên cân nhắc làm điều gì đó hữu ích với nó không?


Có vẻ như không ai có ý tưởng ..? : - /
cody

Câu trả lời:


181

Có một hằng số được định nghĩa trong Parcelableđược gọi là hằng số CONTENTS_FILE_DESCRIPTORđược sử dụng describeContents()để tạo giá trị trả về mặt nạ bit.

Mô tả CONTENTS_FILE_DESCRIPTORtrong tham chiếu API là:

Mặt nạ bit để sử dụng với descriptionContents (): mỗi bit đại diện cho một loại đối tượng được coi là có ý nghĩa đặc biệt tiềm năng khi được sắp xếp.

Mà thực sự có nghĩa là: Nếu bạn cần phải đặt FileDescriptorđối tượng vào Parcelable bạn nên / phải xác định CONTENTS_FILE_DESCRIPTORnhư giá trị trả về của describeContents (), tức là bằng cách " đối tượng đặc biệt " (trong describeContents()'s mô tả) họ thực sự có nghĩa là: FileDescriptor.

Toàn bộ chức năng Parcelable này có vẻ chưa hoàn thành (đọc: có thiết kế xấu). Có một điều kỳ lạ khác trong tài liệu:

Các lớp triển khai giao diện Parcelable cũng phải có một trường tĩnh được gọi là CREATOR, là một đối tượng triển khai giao diện Parcelable.Creator

Thực hiện đa kế thừa theo quy tắc được xác định ở dạng con người có thể đọc được? :-)

Có vẻ như lập trình viên C ++ đã thiết kế Parceablevà tại một thời điểm nào đó anh ta nhận ra: Ồ, chết tiệt, không có đa kế thừa trong Java ... :-)


2
Cảm ơn cho lời giải thích chi tiết này. Tôi đã tìm thấy câu trả lời của bạn sau khi bị thất vọng bởi hướng dẫn này tuyên bố rằng describeContents()sẽ trả về 0 bất cứ khi nào nó "không có gì đặc biệt về nó" . Mà không thực sự giải thích bất cứ điều gì. Lời giải thích của bạn rõ ràng hơn rất nhiều!
WebViewer

1
@LeoLink android.os.ParcelFileDescriptor
Ognyan

7
Nó không phải là về đa kế thừa. Bạn không thể xác định phương thức tĩnh trong giao diện Java, không phải trong phiên bản được sử dụng trong Android, do đó trường CREATOR này.
Aleks N.

1
@Ogre_BGR Tôi vẫn chưa hiểu. Có thể bạn có thể hiển thị một mã ví dụ về thời điểm nó có thể hữu ích?
nhà phát triển Android

2
@androiddeveloper Tôi nghĩ rằng nó không được sử dụng trong phát triển ứng dụng "bình thường". Có vẻ như nó chỉ được sử dụng bởi các phương thức gốc để truyền thông tin giữa các quy trình. Hãy xem tại InputChannel.java (lớp mô tả bình luận) và android_os_Parcel.cpp
Ognyan

7

Chỉ có hai giá trị có thể có, 0 hoặc CONTENTS_FILE_DESCRIPTOR

nếu bạn đang tuần tự hóa POLO, giá trị này phải luôn là 0, CONTENTS_FILE_DESCRIPTOR được dành riêng cho ParcelFileDescriptor , có thể tuần tự hóa Trình mô tả tệp (FD) trong hệ thống * unix.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.