Aula 11 - Threads e Coroutines 🧵
🛑 O Bloqueio da UI
O Android é um sistema exigente: ele redesenha a tela a cada 16ms (60fps).
- Main Thread: Onde tudo o que é visual acontece.
- Regra de Ouro: Nunca coloque código pesado na Main Thread.
O Erro ANR 💀
Se a Main Thread parar por +5 segundos... Application Not Responding. O sistema mata seu app.
- Download de arquivos.
- Leitura de banco de dados pesada.
- Processamento de imagens.
⚡ Kotlin Coroutines
"Threads leves".
- Você pode rodar milhões sem travar o celular.
- Código assíncrono que parece sequencial.
- Criado pela JetBrains para facilitar sua vida.
🏛️ Os 3 Pilares da Coroutine
- Job: A tarefa em si (o trabalho).
- Scope: Onde ela vive (morreu a tela, morre a tarefa).
- Dispatcher: Em qual pista ela corre (Threads).
🚦 Conheça os Dispatchers
- Main: Só para interface (UI).
- IO: Rede, Banco, Arquivos (Espera).
- Default: Cálculos pesados de CPU.
🛌 A palavra-chave suspend
"Esta função pode demorar, mas não vai travar o celular".
🧠 Coroutines na ViewModel
class MeuViewModel : ViewModel() {
fun carregar() {
viewModelScope.launch { // Inicia no Scope seguro
val dados = withContext(Dispatchers.IO) {
api.getDados() // Roda em background
}
binding.txt.text = dados // Volta pra Main e atualiza
}
}
}
🔌 Sockets (Tempo Real)
REST é: "Eu peço, você responde". Socket é: "Canal aberto, qualquer um fala".
- Full-Duplex: Envio e Recebimento simultâneo.
- Casos: Chat, GPS em tempo real, Bolsa de Valores.
Socket vs REST
sequenceDiagram
participant App
participant Server
Note over App,Server: REST (Request/Response)
App->>Server: Me dá os dados?
Server->>App: Aqui estão. (Fecha)
Note over App,Server: Socket (Persistent)
App->>Server: Abre conexão
Server->>App: Conectado!
Server->>App: Mensagem nova!
App->>Server: Valeu!
🆚 Android vs iOS (Async)
| Recurso | Android (Kotlin) | iOS (Swift) |
|---|---|---|
| Padrão | Coroutines | Async / Await |
| Palavra | suspend |
async |
| Chamada | launch |
Task |
| Espera | delay |
try await Task.sleep |
🚫 Cancelamento Automático
O viewModelScope é fantástico.
- Usuário abre a tela e começa o download.
- Usuário fecha o app ou muda de tela.
- O download é cancelado na hora. Economia de bateria e dados!
🛠️ Prática: O Simulador de Corrida
suspend fun corrida() {
println("3...")
delay(1000)
println("2...")
delay(1000)
println("1...")
delay(1000)
println("JÁ!")
}
- Chame isso num clique de botão e tente clicar em outro botão enquanto a contagem ocorre. Se funcionar, você venceu o ANR! 🏆
🏁 Conclusão
- Main Thread é sagrada.
- Coroutines trazem ordem ao caos assíncrono.
- Sempre use
viewModelScopepara segurança.