Sobes.tech
Middle+

Como resolver o problema de fugas de memória no RxJava?

sobes.tech IA

Resposta da IA

Cancelar subscrição.

Utilize CompositeDisposable para gerir as subscrições.

// Criar uma instância
private val compositeDisposable = CompositeDisposable()

// Adicionar a subscrição ao CompositeDisposable
compositeDisposable.add(
    observable.subscribe(
        { resultado -> /* processar resultado */ },
        { erro -> /* processar erro */ }
    )
)

// Cancelar todas as subscrições ao destruir o componente (por exemplo, em onDestroy())
override fun onDestroy() {
    super.onDestroy()
    compositeDisposable.dispose()
}

Use operadores que gerenciem o ciclo de vida.

  • takeUntil(): Termina o Observable quando outro Observable emite um elemento.
  • autoDispose() (da biblioteca RxLifecycle ou AutoDispose): Desinscreve-se automaticamente ao terminar o ciclo de vida do componente.

Use referências fracas.

// Exemplo de uso de WeakReference para Context
WeakReference<Context> contextRef = new WeakReference<>(context);

// Dentro da subscrição, verificar a existência de uma referência forte antes de usar
contextRef.get()?.run {
    // Usar Context
}

Tenha cuidado com referências implícitas, por exemplo, em lambdas ou classes anónimas, que podem capturar o contexto ou outros objetos com ciclo de vida prolongado.

Evite criar Observables que nunca terminam, a menos que sejam duradouros, como os Hot Observables, que se espera que emitam eventos continuamente.

Use o Android Profiler para detectar fugas de memória.