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.

Matheus,

Você pode tentar da seguinte forma:

Em vez de manter a Conversa como atributo de Service, faça dela uma instância global (um atributo de uma subclasse de Application ou então um Singleton) e faça dela uma "observável" da Activity que precisa chamar notifyDataSetChanged(), e que será a "observadora" ou listener (se quiser criar uma subclasse de ListView e fazer dela a observadora no lugar da activity, também pode funcionar). A classe observadora deverá implementar uma interface ConversaListener que contém um método atualizar() por exemplo. A implementação desse método deverá chamar notifyDataSetChanged() na ListView.

Conversa deverá ter métodos adicionarListener(ConversaListener) e removerListener(ConversaListener). Quando um listener for adicionado, você pode guardar o listener em um atributo de Conversa.

Agora basta alterar o método Conversa.addMessage() para chamar listener.atualizar() logo após a mensagem ter sido adicionada à conversa. Garanta que addMessage() só possa ser chamado pelo thread principal, lançando uma exceção se estiver sendo chamado por um thread diferente do principal. Isso garantirá que notifyDataSetChanged() também seja chamado pelo thread principal.

Os locais adequados para chamar adicionarListener(this) e removerListener(this), no caso de uma activity, serão em onResume() e onPause() respectivamente.

Quando o service receber uma mensagem nova, use um Handler para chamar Conversa.addMessage() pelo thread principal. Acredito que irá funcionar.


2014-11-06 20:37 GMT-02:00 Rodrigo Piovezan <piovezan@gmail.com>:
Como falei, vou ficar devendo uma solução com o Otto porque não conheço event bus. Quem conhece pode ajudar melhor.

2014-11-06 12:35 GMT-02:00 Matheus Henrique da Silva <matheustargaryen@gmail.com>:

Só me corrigindo. Eu pensei melhor, e acho que o problema pode continuar. Pq afinal, o problema não acontece quando vamos dar notifydatasetchanged e uma nova mudança esta ocorrendo? Então, se eu dar notify e uma nova alteração no service estiver ocorrendo, vou continuar tendo o problema do mesmo jeito por serem a mesma instancia.
Eu preciso lançar esse app, a parte de programação ta praticamente pronta e esse IlegalStateException esta atrasando td...

Eu pensei uma outra gambiarra aqui... E se eu tiver uma variavel indicando quando a conversa esta sendo exibida? Ela pode ser controlada no onResume() e onPause() do fragment.
Ao receber a mensagem, o service verifica e caso a conversa esta ativa, ou seja, o fragment dessa conversa eh que esta sendo exibido pro usuario, ao inves de adicionar a mensagem à conversa ali, envia a mensagem pelo Otto e quem adiciona é o fragment, logo antes de dar notify.
Uma questão que eu pensei é: posso confiar na sincronia desse esquema? Por exemplo, pode acontecer de o service identificar a conversa como ativa e enviar via Otto mas antes de receber o usuario foi pra outra aba, o que desregistrou o bus e essa mensagem foi perdida pra sempre?

Chatinho esse erro hein, a Google poderia ter pensado nisso... =/

Muito obrigado mais uma vez pela paciencia.

--
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