Pular para conteúdo

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

  1. Job: A tarefa em si (o trabalho).
  2. Scope: Onde ela vive (morreu a tela, morre a tarefa).
  3. 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".

suspend fun buscarDados() {
    delay(2000) // Pausa a coroutine, não a thread!
    println("Terminei")
}

🧠 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.

  1. Usuário abre a tela e começa o download.
  2. Usuário fecha o app ou muda de tela.
  3. 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 viewModelScope para segurança.

❓ Perguntas sobre Threads?


Próxima Aula: UX e Material Design 3! 🎨👋