Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

AsyncTask e Ciclo de Vida das Apps no Android

Boa noite, amigos.

A AsyncTask realmente facilita nossa vida quanto à comunicação entre threads.

Entretanto, ela parece não ser suficiente quando tem que conviver com o ciclo de vida das activities.

Tenho usado o padrão MVP, contruindo o presenter um singleton e registrando a activity como uma "view" (usando o termo próprio do MVP, não uma view do android) no evento OnResume, e desresgistrando no OnPause.

Dessa forma, abstraio os estados relacionados a casos de uso, dos estados relacionados ao ciclo de vida da activity.

Lembrando sempre de não prender nenhuma referência às classes do Android no Presenter, pra não gerar memory leaks. Gostaria de saber se essa é uma boa arquitetura pro android.

Abraços a todos.

6 respostas

Oi Michel, eu fico em dúvida da necessidade de todas essas camadas.. o pattern em si, acho que nem cabe discutir, já que ele é super utilizado por aí e tem a sua aplicabilidade... Pesa sempre a complexidade da sua app em relação ao número de camadas que vc quer colocar nela. Não é uma crítica, só um alerta mesmo :).

Em relação a async task em si, ela foi criada justamente para interagir bem com o ciclo de vida da activity.. ela possuí métodos onde vc pode acessar a view, como o onPostUpdate e métodos que não tem esse acesso, como o doInBackground.

Olá Alberto. Obrigado pela atenção. É que pode dar algum problema caso o bloco do onPostExecute seja executado e a Activity não exista mais (por exemplo, antes da resposta de rede, o usuário vira o celular, destruindo aquela activity e recriando uma nova instância). Nesse caso, qualquer referência da asynctask relacionada activity que a disparou, será nula. Qual a melhor prática nesse caso?

Claro que, no caso do app do curso, é só um Toast. Mas, se eu quisesse interagir com a activity, poderia dar algum problema, não?

Poderia dar problema sim, tem razão. Acho que nesse caso é melhor usar as libs de requisições assíncronas, como o Retrofit e tal... Controlar isso na mão ia ser muito chato. De todo jeito, vou repassar a dúvida para algum especialista de android para ver se ele tem outra opinião :). Amanhã vc deve ter algum outro feedback :).

Ok. Te agradeço novamente pela atenção! Fico no aguardo! Bom resto de domingo! :) Abraços!

solução!

Oi Michel, tudo bem ?

A melhor prática tratando de AsyncTask é você não a amarrar com nenhum refêrencia, para você poder ter reaproveitamento de código, ou seja, poder reaproveitar essa classe ( Async Task ).

Para não termos nenhuma referencia que nos dê problema no momento de disparar a resposta do servidor, nós pedimos para que a AsyncTask avise a quem está interessado, para fazer esse papel usamos o BroadcastReceiver, que consegue enviar e receber o evento. Contudo realizar esse processo manual é bem complicado e um código um pouco chato de ser escrito, porém necessário, por isso a galera da comunidade encapsulou esse comportamento e foi criado um padrão chamado event bus, existem algumas implementações :

Contudo a mais famosa e mais utilizada é :

O próprio Alberto já falou sobre uma biblioteca bem comum de desenvolvimento, que serve para cuidar das requisições, que é o Retrofit, eu recomendo que a use, pelo fato dela já fazer as requisições sincronas e assincronas, totalmente encapsuladas, dá uma olhadinha na documentação deles que é bem de boa de usar e deve resolver bastante os seus problemas :D

http://square.github.io/retrofit/

Abraços

Show. Conheço o EventBus. É bem fácil de implementar. Quanto ao Retrofit, vou dar uma olhada, mas sei que é bem citado pela comunidade. Muito obrigado pela atenção! Abraços!