Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Re: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.

Vamos lá:

A conversa ser um singleton foi uma coisa que pensei no momento mas não necessariamente faz sentido no seu aplicativo. Pois você falou que tem várias conversas. O importante é que essas conversas sejam acessíveis globalmente por qualquer classe do seu aplicativo.

Você entendeu o conceito do listener corretamente, eu só citei o "observável" porque o nome do design pattern é Observer e não Listener, mas dá no mesmo.

Sua idéia de adicionar a conversa via UI thread e no mesmo thread disparar um intent que será recebido no fragment para dar o notifyDataSetChanged() provavelmente não irá garantir que as duas operações sejam sequenciais, visto que sendBroadcast() é uma ação assíncrona (a mensagem de recebimento do broadcast será acrescentada ao Looper do UI thread em uma mensagem à parte, e nada garante que não haja mensagens intermediárias a serem processadas antes dela e com o potencial de lançarem a IllegalStateException).

Imaginei que a listview pudesse ficar num fragment, só não falei nada na hora porque não me ocorreu em quais partes do ciclo de vida dele deveriam ser chamados adicionarListener() e removerListener(). :) Mas provavelmente em onResume() e onPause() mesmo. Como você tem vários fragments, cada um correspondendo a uma conversa, a solução no caso é cada fragment ser o listener de uma conversa. Com isso você pode dispensar os broadcasts para fragments que vinha fazendo no service.

2014-11-09 0:25 GMT-02:00 Matheus Henrique da Silva <matheustargaryen@gmail.com>:
Obrigado mais uma vez, sua resposta me parece uma boa aproximação de uma solução, mas eu ainda tenho alguma duvidas que gostaria de esclarecer antes de implementar.

Queria entender a necessidade do singleton e o que vc quis dizer com "e faça dela uma "observável" da Activity que precisa chamar notifyDataSetChanged()". Isso é apenas o que vc explicou mais adiante, ou seja, ter uma instancia da interface dentro da conversa para nela chamar uma atualização que sera recebida na classe que implementar essa interface? Se for só isso eu entendi, é que eu nunca usei Observer ou ContentObserver.

Eu tambem gostaria de saber uma coisa, até então eu não estava usando um handler para adicionar a mensagem à conversa no service. Apenas adicionava e depois enviava uma intent.
Por acaso se eu adicionar a mensagem à conversa no service pela UI thread via handler e logo depois, ainda na UI thread, enviar uma intent que sera recebida no fragment para dar notify na listview, evitará o IllegalStateException?

E só pra esclarecer melhor a situação, a listview fica num fragment, e nao na activity. O app é um cliente IRC que usa a library PircBotX e estou usando actionbar com tabs. A primeira tab (primeiro fragment) será estática e representará o chat do #canal (o app será de apenas um canal) e as outras tabs serao dinâmicas e serao adicionadas e removidas conforme o usuario abrir e fechar conversas privadas (PVT's).
Eu perguntei sobre intents pq ela me atende bem devido ao fato de que eu posso ter varios fragments, varios listviews, e eu estava usando a tag do fragment como category do filter do broadcast receiver, dessa forma cada um receberia o seu certinho. E essa tag do fragment é justamente o ID do user com que estou conversando (apenas o nome do canal caso seja o fragment do canal), então tudo se encaixava bem, até o IllegalStateException acabar com td rsrs.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário