Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Executar operações de rede na thread principal de uma aplicação Android é uma armadilha comum que leva ao erro 'android.os.NetworkOnMainThreadException'. Apesar de ser uma prática conhecida, muitos desenvolvedores ainda insistem em realizar chamadas de rede diretamente no ciclo de vida da UI, o que prejudica a performance e a estabilidade do app.
---
Android impede operações de rede no thread principal para evitar o congelamento da interface do usuário. Quando um código tenta abrir uma conexão de rede, como a leitura de um feed RSS, diretamente na UI, o sistema lança essa exceção. A consequência é que o aplicativo fica com a interface travada até a operação terminar, além de gerar um crash. A decisão fica mais saudável quando o time consegue medir o impacto depois.
---
A tentativa comum é fazer o fetch do feed RSS dentro do método onCreate() ou em qualquer método que rode na thread principal, como uma resposta a um clique. Essa abordagem parece simples, mas ignora a responsabilidade de não bloquear a UI. AsyncTask foi a solução padrão por anos, mas foi depreciada por sua limitação de gerenciamento de ciclo de vida e dificuldade de manutenção. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Outro ponto crítico é a falta de gerenciamento de exceções e controle de erros assíncronos, o que torna o código difícil de evoluir e depurar. Quando a operação de rede falha, o app não consegue reagir de forma adequada, impactando a experiência do usuário.
---
A alternativa mais recomendada hoje é usar componentes como Kotlin Coroutines, LiveData ou até o padrão de WorkManager, dependendo do contexto. Para quem ainda trabalha com Java, a ideia é envolver a operação de rede em tarefas assíncronas gerenciadas por threads separadas. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Por exemplo, uma implementação com ExecutorService permite criar uma thread dedicada para a operação de rede, garantindo que a UI continue responsiva. Além disso, combiando com um mecanismo de callback, é possível atualizar a interface após o término da operação. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
ExecutorService executor = Executors.newSingleThreadExecutor(). Handler handler = new Handler(Looper.getMainLooper()). executor.execute(() -> {
try {
URL url = new URL(urlToRssFeed). SAXParserFactory factory = SAXParserFactory.newInstance(). SAXParser parser = factory.newSAXParser(). XMLReader xmlreader = parser.getXMLReader(). RssHandler handler = new RssHandler(). xmlreader.setContentHandler(handler). InputSource is = new InputSource(url.openStream()). xmlreader.parse(is). handler.getFeed(). handler.close(). // Atualiza a UI na thread principal
handler.post(() -> {
// Código para atualizar a interface
}). } catch (Exception e) {
// Trate o erro adequadamente
}
}).
---
Optar por Threads dedicadas traz controle, mas exige cuidado com gerenciamento de ciclo de vida e possíveis vazamentos de memória. Usar APIs mais modernas, como Kotlin Coroutines, simplifica esse gerenciamento, além de melhorar a legibilidade do código. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Por outro lado, soluções como Retrofit ou OkHttp já encapsulam essa lógica, facilitando o consumo de APIs de forma assíncrona e robusta. Ainda assim, o entendimento profundo do ciclo de vida da aplicação é essencial para evitar vazamentos e falhas. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
1. Identifique operações de rede no seu código.
2. Substitua chamadas síncronas por componentes assíncronos, como ExecutorService ou coroutines.
3. Garanta que a UI seja atualizada na thread principal.
4. Teste diferentes cenários de falha de rede para evitar crashes.
5. Considere usar bibliotecas de consumo de API que já encapsulam essa lógica.
A mudança de paradigma de uma execução síncrona para assíncrona é fundamental para modernizar aplicativos Android e reduzir bugs relacionados à rede. A adaptação exige disciplina, mas os resultados valem a pena, principalmente na experiência do usuário e na estabilidade do app. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Carregando comentários...