01. DADOS GERAIS
| Produto: | TOTVS Agro Bioenergia |
|---|---|
| Linha de Produto: |
|
| Segmento: | Engenharia |
| Módulo: | APLICATIVOS PORTATEIS |
| Função: | APLICAÇÕES MOBILIDADE (Meus Aplicativos TOTVS) |
| Ticket: | |
| Requisito/Story/Issue (informe o requisito relacionado) : | DAGROFRAME-5763 |
02. SITUAÇÃO/REQUISITO
Na classe MenuActivity do Meus Aplicativos TOTVS existem classes e métodos com implementações depreciadas, com a utilização da classe AsyncTask para processo que acontecem em background. Há também a utilização de Hadlers de forma depreciada e que devem ser
A forma atual da classe MenuActivity pode causar vazamento de memória, o que pode causar fechamento do aplicativo de forma inesperada.
03. SOLUÇÃO
Remoção da Classe AsyncTask
Contexto
A classe AsyncTask foi descontinuada a partir do Android API 30 (Android 11), sendo recomendada a utilização de alternativas mais modernas e seguras, como ExecutorService, HandlerThread ou bibliotecas como Coroutine (Kotlin) e RxJava.
Remoção de AsyncTask:
Todos os usos de AsyncTask foram removidos da classe MenuActivity.
As operações assíncronas, como chamadas de rede e processamento em background, foram migradas para o uso de ExecutorService com Runnable e callbacks para a thread principal via Handler.
Substituição por ExecutorService:
Foi criado um ExecutorService de thread única para executar tarefas em background.
O retorno dos resultados para a UI é feito utilizando um Handler associado ao Looper.getMainLooper().
Benefícios:
- Maior controle sobre o ciclo de vida das tarefas.
- Melhor compatibilidade com versões recentes do Android.
- Redução do risco de vazamento de memória.
Ajustes nas Classes que Herdam de Handler
Contexto
O uso de Handler foi revisado para garantir que não haja vazamento de memória e que as mensagens sejam tratadas corretamente, principalmente após a remoção do AsyncTask.
Alterações Realizadas
Uso de WeakReference:
Todas as classes que estendem Handler agora recebem uma referência fraca (WeakReference) para a Activity ou contexto, evitando vazamentos de memória caso a Activity seja destruída antes do processamento da mensagem.
Encapsulamento e Responsabilidade:
Os métodos handleMessage foram revisados para garantir que:
- Sempre verifiquem se a referência da Activity ainda é válida e não está finalizada.
- Não executem ações na UI caso a Activity esteja em processo de finalização.
Remoção de Dependências com AsyncTask:
Os Handler agora são utilizados em conjunto com o ExecutorService para receber mensagens de conclusão de tarefas assíncronas, substituindo o papel do onPostExecute do AsyncTask.
Limpeza de Mensagens:
Nos métodos onPause e onDestroy da MenuActivity, são chamados removeCallbacksAndMessages(null) nos Handler para evitar o processamento de mensagens após o ciclo de vida da tela.
Exemplo de Ajuste
Antes (com AsyncTask):
Execução assíncrona e retorno para a UI via onPostExecute.
Depois (com ExecutorService e Handler):
Execução assíncrona via executorService.execute().
Retorno para a UI via mainThreadHandler.post() ou envio de mensagem para o Handler customizado.
Impacto
Manutenção: Código mais moderno, seguro e alinhado com as práticas recomendadas do Android.
Performance: Menor risco de vazamentos e travamentos por referência indevida à UI.
Compatibilidade: Pronto para futuras versões do Android.
04. DEMAIS INFORMAÇÕES
Não se aplica
05. ASSUNTOS RELACIONADOS
Não se aplica