Programação Reativa em Kotlin: Biblioteca RxKotlin e Corrotinas

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

Programação Reativa em Kotlin: do RxKotlin às Corrotinas

Programação reativa é um paradigma focado no processamento assíncrono de fluxos de dados e na propagação de mudanças. No ecossistema Kotlin, esse conceito é implementado de duas formas principais: através da biblioteca RxKotlin (extensões reativas para Kotlin baseadas no RxJava) e através do mecanismo nativo de corrotinas com Flow. Neste artigo, analisaremos detalhadamente ambas as abordagens, suas características e exemplos de uso.



O que é Programação Reativa?

A ideia central da programação reativa é trabalhar com dados como fluxos contínuos (streams). Em vez de solicitar dados e aguardar uma resposta, você se inscreve em um fluxo e reage a cada novo evento. Isso é especialmente útil para aplicações de UI, processamento de entrada do usuário, requisições de rede e trabalho com bancos de dados.



Biblioteca RxKotlin

RxKotlin é um wrapper sobre o RxJava que adiciona extensões convenientes para Kotlin, como lambdas, funções de extensão e suporte a null-safety. Os principais tipos são:

  • Observable<T> — um fluxo que pode emitir de 0 a N elementos e terminar com erro ou sucesso.
  • Single<T> — um fluxo que emite exatamente um elemento ou um erro.
  • Flowable<T> — um fluxo com suporte a backpressure (controle de velocidade de consumo).
  • Completable — um fluxo que apenas termina (sucesso/erro) sem dados.


Exemplo com RxKotlin

import io.reactivex.rxjava3.core.Observableimport io.reactivex.rxjava3.schedulers.Schedulers

fun main() { val observable = Observable.create<String> { emitter -> emitter.onNext("Olá") emitter.onNext("do") emitter.onNext("RxKotlin") emitter.onComplete() }

observable .subscribeOn(Schedulers.io()) .observeOn(Schedulers.single()) .subscribe( { value -> println("Recebido: $value") }, { error -> println("Erro: ${error.message}") }, { println("Fluxo concluído") } )

Thread.sleep(1000) // Aguarda a conclusão das operações assíncronas}

Neste exemplo, é criado um Observable que emite três strings e é concluído. Os operadores subscribeOn e observeOn gerenciam as threads de execução.



Corrotinas e Flow em Kotlin

A partir do Kotlin 1.3, as corrotinas tornaram-se parte da linguagem, e o Flow (introduzido na versão 1.3.70) é um fluxo reativo totalmente integrado com corrotinas. Vantagens sobre o RxKotlin:

  • Menos overhead (corrotinas leves vs threads Java).
  • Integração natural com funções suspend.
  • Suporte a structured concurrency (cancelamento automático ao finalizar o escopo).
  • Sintaxe mais limpa, sem callbacks.


Exemplo com Flow

import kotlinx.coroutines.*import kotlinx.coroutines.flow.*

fun main() = runBlocking { val flow = flow { for (i in 1..5) { delay(100) // Simula trabalho assíncrono emit(i) // Emite um elemento } }

flow .map { it * it } // Transformação .catch { e -> println("Erro: $e") } .collect { value -> println("Quadrado: $value") }}

O Flow é preguiçoso: os dados começam a ser gerados apenas quando collect é chamado. Operadores como map, filter, flatMapConcat funcionam da mesma forma que no Rx.



Comparação entre RxKotlin e Flow

Recommendations

Característica RxKotlin Flow + Corrotinas
Dependências