Parcelable onde / quando o describeContents () é usado?


93

Alguém sabe onde / quando esse método de Parcelable é chamado?

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

Tem que ser anulado. Mas devo pensar em fazer algo útil com ele?


Parece que ninguém tem uma ideia ..? : - /
cody

Respostas:


181

Há uma constante definida em Parcelablechamada CONTENTS_FILE_DESCRIPTORque deve ser usada describeContents()para criar o valor de retorno do bitmask.

A descrição para CONTENTS_FILE_DESCRIPTORna API ref é:

Máscaras de bits para uso com describeContents (): cada bit representa um tipo de objeto considerado como tendo significado especial potencial quando empacotado.

O que realmente significa: Se você precisa colocar FileDescriptorobjeto em Parcelable você deve / tem de especificar CONTENTS_FILE_DESCRIPTORcomo valor de retorno de describeContents (), ou seja, por " objeto especial " (na describeContents()descrição 's) eles realmente querem dizer: FileDescriptor.

Toda a funcionalidade Parcelable parece inacabada (leia-se: tem um design ruim). Há uma outra coisa estranha nos documentos:

As classes que implementam a interface Parcelable também devem ter um campo estático chamado CREATOR, que é um objeto que implementa a interface Parcelable.Creator

Implementando herança múltipla por regras definidas em formato legível por humanos? :-)

Parece que o programador C ++ projetou Parceablee em algum ponto ele percebeu: Oh, droga, não há herança múltipla em Java ... :-)


2
Obrigado por esta explicação detalhada. Eu encontrei sua resposta depois de ficar frustrado com este tutorial alegando que describeContents()deveria retornar 0 sempre que "não tivesse nada de especial sobre isso" . O que realmente não explica nada. Sua explicação é muito mais clara!
WebViewer

1
@LeoLink android.os.ParcelFileDescriptor
Ognyan

7
Não se trata de herança múltipla. Você não pode definir um método estático em uma interface Java, não na versão usada no Android, daí este campo CRIADOR.
Aleks N.

1
@Ogre_BGR Ainda não entendi. Talvez você possa mostrar um código de exemplo de quando pode ser útil?
desenvolvedor Android

2
@androiddeveloper Acho que não deve ser usado no desenvolvimento "normal" de aplicativos. Parece que só é usado por métodos nativos para passar informações entre processos. Por favor, dê uma olhada InputChannel.java (classe descrevendo comentário) e android_os_Parcel.cpp
Ognyan

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.