Como lidar com erros com Retrofit e Coroutines

Douglas Iacovelli
Oct 6, 2019 · 2 min read

Neste artigo será mostrada uma solução para lidar com erros utilizando Retrofit + Coroutines + Moshi.

Existem algumas implementações parecidas na internet mas nenhuma delas testa unitariamente e também não converte repostas de erro para um modelo que o app saiba tratar. Sendo assim é importante dizer que a solução criada pelo Cesar e por mim se baseia neste artigo.

Como implementar?

Normalmente para lidar com erros em coroutines se usa try/catch. Não há como fugir dessa solução, mas pode-se evitar que isso esteja espalhado por todo código. A solução é utilizar uma sealed class.

1. Criar uma sealed class de resultado

Esta sealed class representará um resultado, que poderá ser Sucesso, Erro de Internet ou um Erro Genérico.

Quando o erro for genérico (não-200), então haverá uma tentativa de converter a resposta em um modelo que o app saiba tratar. Assim será possível mostrar um erro específico e claro para o usuário.

2. Criar um método para encapsular as chamadas

Neste método será executada a chamada de rede dentro de um try/catch para tentar recuperar caso algum erro aconteça.

  • O primeiro parâmetro é um CoroutineDispatcher que será necessário para fazer testes unitários tanto do repositório quanto desta função em si. O segundo parâmetro é uma função lambda coroutine que é onde será chamado o serviço remoto para buscar os dados.

E como utilizar esta solução?

Repository

Dentro do repository será realizada a chamada para o método safeApiCall passando como bloco de execução o método do service para obter os dados e em sequência a tentativa de conversão para um objeto de domínio.

ViewModel

Já o viewModel será responsável por chamar o repository e interpretar o resultado da sealed class criada anteriormente.

Teste unitário

É interessante notar que também é possível testar a função safeApiCall unitariamente para não ter que testar essa lógica em todo repository em que ela for utilizada. Veja como fica:


Atualização: No artigo, uma instância nova do Moshi é criada a cada vez que se tenta converter a resposta de erro. Idealmente essa instância poderia ser Singleton para evitar a recriação.


Caso tenha gostado do post, por favor segure as palmas para ajudar na divulgação e se tiver dúvidas e/ou sugestões deixe nos comentários :)

Android Dev BR

Artigos em português sobre Android, curados pela comunidade Android Dev BR. Junte-se a nós: slack.androiddevbr.org.

Douglas Iacovelli

Written by

Android Dev BR

Artigos em português sobre Android, curados pela comunidade Android Dev BR. Junte-se a nós: slack.androiddevbr.org.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade