DEV Community

Cover image for Programação Assíncrona na Prática com Kotlin: Exemplos Reais e Otimização
Alan Gomes for Comunidade Dev Space

Posted on

Programação Assíncrona na Prática com Kotlin: Exemplos Reais e Otimização

1 – Introdução

Entender os conceitos de programação assíncrona é essencial, mas aplicar esses conceitos em cenários reais é onde as coisas realmente ganham vida. Neste artigo, exploraremos exemplos práticos de como a programação assíncrona pode ser usada para otimizar tarefas e melhorar a performance de aplicações no Kotlin.

Usaremos como base os exemplos do Café Síncrono vs. Assíncrono, mostrando os benefícios de pensar assincronamente para resolver problemas do dia a dia de um desenvolvedor.


2 – Revisão do Problema: Tarefas Bloqueantes

Em um fluxo síncrono, cada tarefa depende da conclusão da anterior. Isso significa que o tempo total de execução é a soma do tempo de todas as tarefas. Por outro lado, a programação assíncrona permite que múltiplas tarefas sejam realizadas simultaneamente, reduzindo drasticamente o tempo total de execução.

Exemplo: Preparando Café Síncrono

import kotlinx.coroutines.*

fun main() = runBlocking {
    fazerCafeSincrono()
    println("Café finalizado.")
}

suspend fun fazerCafeSincrono() {
    println("Pegando a água...")
    delay(1000) // Simula o tempo para pegar a água
    println("Fervendo a água...")
    delay(2000) // Simula o tempo para ferver a água
    println("Passando o café...")
    delay(1000) // Simula o tempo para passar o café
}
Enter fullscreen mode Exit fullscreen mode

Saída no console

Pegando a água...
Fervendo a água...
Passando o café...
Café finalizado.

  • Problema: Todas as tarefas são feitas em sequência. O tempo total de execução é 4 segundos.

3 – Solução: Café Assíncrono

Com a programação assíncrona, podemos realizar tarefas paralelas, como ferver a água enquanto preparamos o filtro, reduzindo o tempo total de execução.

Exemplo: Preparando Café Assíncrono

import kotlinx.coroutines.*

fun main() = runBlocking {
    val agua = async { ferverAgua() }
    val filtro = async { prepararFiltro() }

    agua.await() // Aguarda a água estar pronta
    filtro.await() // Aguarda o filtro estar pronto

    println("Passando o café...")
    delay(1000) // Simula o tempo para passar o café
    println("Café finalizado.")
}

suspend fun ferverAgua() {
    println("Pegando a água...")
    delay(1000) // Simula o tempo para pegar a água
    println("Fervendo a água...")
    delay(2000) // Simula o tempo para ferver a água
}

suspend fun prepararFiltro() {
    println("Preparando o filtro e o pó...")
    delay(1500) // Simula o tempo para preparar o filtro
}
Enter fullscreen mode Exit fullscreen mode

Saída no console

Pegando a água...
Preparando o filtro e o pó...
Fervendo a água...
Passando o café...
Café finalizado.

4 – Casos Reais de Programação Assíncrona

4.1 – Carregamento de Dados em Aplicativos

Imagine um aplicativo que precisa carregar dados de múltiplas APIs para montar uma interface.

Com programação síncrona, cada requisição seria feita uma após a outra, aumentando o tempo de espera. Usando corrotinas, todas as requisições podem ser feitas simultaneamente.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val api1 = async { carregarDadosDeApi("API 1") }
    val api2 = async { carregarDadosDeApi("API 2") }

    println("Carregando dados...")
    println(api1.await())
    println(api2.await())
}

suspend fun carregarDadosDeApi(api: String): String {
    delay(2000) // Simula o tempo de resposta da API
    return "$api: Dados carregados"
}
Enter fullscreen mode Exit fullscreen mode

4.2 - Processamento de Arquivos

Ao processar múltiplos arquivos grandes, como logs ou imagens, corrotinas podem ajudar a dividir e paralelizar o trabalho, reduzindo o tempo total de processamento.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val arquivos = listOf("Arquivo1.txt", "Arquivo2.txt", "Arquivo3.txt")

    arquivos.map { arquivo ->
        launch { processarArquivo(arquivo) }
    }
}

suspend fun processarArquivo(nome: String) {
    println("Processando $nome...")
    delay(1500) // Simula o tempo de processamento
    println("$nome processado!")
}
Enter fullscreen mode Exit fullscreen mode

5 – Benefícios de Pensar Assincronamente

  1. Eficiência de tempo: Tarefas paralelas reduzem o tempo total de execução.
  2. Melhor experiência do usuário: Aplicativos mais responsivos e rápidos.
  3. Uso ideal de recursos: Aproveita melhor o poder de processamento disponível.

6 – Conclusão

A programação assíncrona é uma habilidade essencial para qualquer desenvolvedor que deseja criar aplicações eficientes e modernas. Usar corrotinas no Kotlin permite que você lide com tarefas complexas de forma simples e escalável.

Resumo:

  1. O exemplo do café mostra como tarefas paralelas otimizam o tempo de execução.
  2. Casos reais, como carregamento de APIs e processamento de arquivos, destacam os benefícios práticos das corrotinas.

No próximo artigo, discutiremos como integrar esses conceitos com fluxos (Flow) e como otimizar ainda mais sua programação assíncrona.

Referência
Documentação oficial do Kotlin sobre corrotinas

Sentry mobile image

App store rankings love fast apps - mobile vitals can help you get there

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read full post →

Top comments (0)

👋 Kindness is contagious

DEV is better (more customized, reading settings like dark mode etc) when you're signed in!

Okay