O que é rune em Go? Comparação de abordagens e exemplos reais

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Uma Manhã Que Começa com NetworkOnMainThreadException

\n\n

Você está escrevendo um aplicativo Android. Tudo vai muito bem até que você decide fazer uma simples requisição HTTP em um botão. Você pressiona "Atualizar" — e o aplicativo trava com um stack trace vermelho. Parece familiar? android.os.NetworkOnMainThreadException é um erro clássico que todo desenvolvedor Android já viu pelo menos uma vez na vida. Em 2025, ele ainda está vivo, e os iniciantes continuam pisando no mesmo rake.

\n\n

Neste artigo, vamos detalhar por que o NetworkOnMainThreadException ocorre, como corrigi-lo em Java e quais abordagens são consideradas boas práticas em 2025. Você receberá soluções prontas com código que pode inserir imediatamente no seu projeto.

\n\n

Por Que o NetworkOnMainThreadException Ocorre?

\n\n

O Android não é apenas Java. É um sistema com regras rígidas. Uma delas: não realize operações de rede na thread principal (UI). A thread principal é responsável por renderizar a interface e lidar com toques. Se ela for bloqueada por apenas um segundo, o usuário verá lag, e se por cinco segundos, o sistema mostrará um diálogo "Aplicativo Não Responde" (ANR).

\n\n

A partir do Android 3.0 (Honeycomb), o Google adicionou proteção: qualquer chamada de rede na thread principal lança android.os.NetworkOnMainThreadException. A exceção diz: "Ei, você está fazendo algo perigoso para a experiência do usuário!".

\n\n

Em 2025, essa regra não foi para lugar nenhum. Mesmo se você usar bibliotecas modernas (Retrofit, OkHttp), ainda deve executá-las em uma thread em segundo plano. A exceção não é um bug, mas um recurso de segurança.

\n\n

Top 5 Maneiras de Corrigir o Erro (Java, 2025)

\n\n

Vamos analisar cinco abordagens — desde as obsoletas até as modernas. Escolha a que se adequa ao seu projeto.

\n\n

1. AsyncTask Clássico (Legado, Mas Funciona)

\n\n

O AsyncTask era o padrão há cerca de 10 anos. Em 2025, não é recomendado (está obsoleto na API 30+), mas você ainda pode encontrá-lo em projetos antigos.

\n\n
private class MyNetworkTask extends AsyncTask<String, Void, String> {\n    @Override\n    protected String doInBackground(String... params) {\n        // Esta já é uma thread em segundo plano\n        try {\n            URL url = new URL(params[0]);\n            HttpURLConnection connection = (HttpURLConnection) url.openConnection();\n            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));\n            StringBuilder result = new StringBuilder();\n            String line;\n            while ((line = reader.readLine()) != null) {\n                result.append(line);\n            }\n            return result.toString();\n        } catch (Exception e) {\n            return "Error: " + e.getMessage();\n        }\n    }\n\n    @Override\n    protected void onPostExecute(String result) {\n        // Esta já é a thread da UI\n        textView.setText(result);\n    }\n}\n\n// Lançar:\nnew MyNetworkTask().execute("https://api.example.com/data");
\n\n

Contras: AsyncTask é difícil de testar, inconveniente para cadeias de requisições e pode vazar memória ao girar a tela. Use apenas se o projeto for escrito em Java 7-8.

\n\n

2. Java Thread + Handler (Abordagem Limpa)

\n\n

A maneira mais simples é criar uma thread separada e retornar o resultado para a UI via Handler.

\n\n
private Handler mainHandler = new Handler(Looper.getMainLooper());\n\nprivate void fetchDataInBackground() {\n    new Thread(new Runnable() {\n        @Override\n        public void run() {\n            // Thread em segundo plano\n            final String result = performNetworkCall();\n            \n            // Retornar para a thread da UI\n            mainHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    textView.setText(result);\n                }\n            });\n        }\n    }).start();\n}\n\nprivate String performN                

Blogs

Book Recommendations