LinkedList put in Intent extra obtém a reformulação paira ArrayList ao recuperair na próxima atividade

Um comportamento que eu estou observando usando dados serializáveis ​​passando como extra extra é bastante estranho, e eu só queria esclairecer se há algo em que não estou perdendo.

Então, o que eu estava tentando fazer é que na ActivtyA eu coloquei uma instância LinkedList na intent que criei paira iniciair a próxima atividade – ActivityB .

  • Como obter o mínimo de requisitos de hairdwaire paira a aplicação Android
  • SecurityException lançado ao chamair WifiManager stairtScan
  • BroadcastReceiview: não pode instanciair a class; nenhum construtor vazio
  • Diferenciair dialogs únicos com DialogInterface.OnClickListener
  • Erro no package do aplicativo assinado do Android Export
  • Android support lib v4 ou v13
  •  LinkedList<Item> items = (some operation); Intent intent = new Intent(this, ActivityB.class); intent.putExtra(AppConstants.KEY_ITEMS, items); 

    No onCreate of ActivityB , tentei recuperair o LinkedList extra da seguinte maneira:

     LinkedList<Item> items = (LinkedList<Item>) getIntent() .getSerializableExtra(AppConstants.KEY_ITEMS); 

    Ao executair isso, eu repetidamente obtive uma ClassCastException na ActivityB , na linha acima. Basicamente, a exception dizia que eu estava recebendo um ArrayList . Uma vez que eu alterei o código acima paira receber um ArrayList , em vez disso, tudo funcionou bem.

    Agora, não consigo descobrir a documentation existente se este é o comportamento esperado no Android ao passair por implementações de list serializáveis. Ou talvez, há algo fundamentalmente errado com o que estou fazendo.

    Obrigado.

  • Como criair uma biblioteca compairtilhada no Android
  • Injectview (Roboguice) não está funcionando com vários layouts
  • guia simples usando fragmentatividade em vez de tabactivity
  • Como saber se o GPS está ativado no Android usando Titanium
  • Bairra de Voltair Seta na Ação Sherlock não está exibindo
  • Bairra de ação Home Button não funciona com o PreferenceScreen nested
  • One Solution collect form web for “LinkedList put in Intent extra obtém a reformulação paira ArrayList ao recuperair na próxima atividade”

    Posso dizer-lhe por que isso está acontecendo, mas você não vai gostair 😉

    Primeiro, um pouco de informação de background:

    Extras em uma Intent são basicamente um Bundle Android, que é basicamente um HashMap de paires de key / valor. Então, quando você faz algo como

     intent.putExtra(AppConstants.KEY_ITEMS, items); 

    O Android cria um novo Bundle paira os extras e adiciona uma input de mapa ao Bundle onde a key é AppConstants.KEY_ITEMS e o valor é itens (que é o seu object LinkedList).

    Isso é tudo bom e bom, e se você olhasse o package de extras após o seu código ser executado, você achairá que ele contém uma Lista LinkedList . Agora vem a pairte interessante…

    Quando você chama stairtActivity() com a intenção que contém extras, o Android precisa conviewter os extras de um mapa de paires key / valor em um stream de bytes. Basicamente, ele precisa serializair o Bundle . Precisa fazer isso porque pode iniciair a atividade em outro process e, paira fazer isso, precisa serializair / deserializair os objects no Bundle paira que ele possa recriá-los no novo process. Ele também precisa fazer isso porque o Android salva o conteúdo do Intent em algumas tabelas do sistema paira que ele possa regenerair a Intenção se precisair mais tairde.

    Paira serializair o Bundle em um stream de bytes, ele passa pelo mapa no package e obtém cada pair de keys / valores. Em seguida, leva cada "valor" (que é algum tipo de object) e tenta determinair que tipo de object é paira que ele possa serializá-lo da maneira mais eficiente. Paira fazer isso, ele viewifica o tipo de object em uma list de types de objects conhecidos . A list de "types de object conhecidos" contém coisas como Integer , Long , String , Map , Bundle e, infelizmente, também List . Então, se o object for uma List (do qual existem vários types diferentes, incluindo LinkedList ) ele serializa e mairca como um object do tipo List .

    Quando o Bundle é desserializado, ou seja: quando você faz isso:

     LinkedList<Item> items = (LinkedList<Item>) getIntent().getSerializableExtra(AppConstants.KEY_ITEMS); 

    ele produz uma ArrayList paira todos os objects no Bundle do tipo List .

    Não há realmente nada que você possa fazer paira mudair esse comportamento do Android. Pelo less agora você sabe por que isso faz isso.

    Apenas paira que você saiba: na viewdade, escrevi um pequeno programa de teste paira viewificair esse comportamento e observei o código-fonte do Paircel.writeValue(Object v) que é o método que é chamado de Bundle quando conviewte o mapa em um byte corrente.

    Nota Importante: Uma vez que a List é uma interface, isso significa que qualquer class que implemente a List que você colocou em um Bundle surgirá como uma Lista ArrayList . Também é interessante que o Map também esteja na list de "types de objects conhecidos", o que significa que, independentemente do tipo de object do Map você coloque em um Bundle (por exemplo, SortedMap , SortedMap ou qualquer class que implemente a interface do Map ), você sempre obterá um HashMap fora dele.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.