Qual é a diferença entre Observable, Completable e Single no RxJava

113

Alguém pode explicar a diferença entre Observable, Completable e Single no RxJava com exemplos claros?

Em que cenário usamos um sobre os outros?

Raja Jawahar
fonte
Você experimentou alguma coisa?
J. Chomel
Acabei de começar recentemente .. @ J.Chomel
Raja Jawahar
25
Esta é uma questão perfeitamente válida e não deveria ter sido fechada. Embora rx seja uma ótima biblioteca, a documentação e os exemplos são, infelizmente, extremamente pobres e confusos.
RunLoop

Respostas:

247

Observableé o bloco de construção genérico ReactiveX, de fonte de evento que emite valores ao longo do tempo. (e, portanto, existe em todas as linguagens para a qual ReactiveX foi estendido)
em resumo Os eventos observáveis ​​são:
onNext * (onCompleted | onError)? / (* zero ou mais? - zero ou 1)

Singlee Completablesão novos tipos introduzidos exclusivamente no RxJava que representam tipos reduzidos de Observable, que possuem API mais concisa.

Singlerepresentam Observableque emitem um único valor ou erro.

Completablerepresentam Observableque não emite nenhum valor, mas apenas eventos terminais, onErrorouonCompleted

Você pode pensar nas diferenças como as diferenças de um método que retorna:

  • Coleção de objetos - observáveis

  • Objeto único - Único

  • e método que não retorna valores (método void) - Completável.

Singlepode ser apropriado quando você tem Observável orientado para tarefas e espera um valor único, como a solicitação de rede que é executada uma vez e o valor de retorno (ou erro), a chamada de rede é operada de uma só vez, o que significa que você não espera que ela retorne valores adicionais hora extra. Outro exemplo é a operação de busca de dados do banco de dados.

Completableé apropriado quando você tem um Observablee não se preocupa com o valor resultante da operação, ou não existe. Os exemplos são a atualização de um cache, por exemplo, a operação pode ser bem-sucedida / falhar, mas não há valor.
Outro exemplo é alguma operação init de longa duração que não retorna nada. Pode ser uma chamada de rede UPDATE / PUT que resultou apenas com indicação de sucesso.

Em qualquer caso, Completable e Single não estão adicionando novos recursos, mas estão introduzindo APIs mais robustas e concisas, que informam mais sobre as operações por trás do Observable que a API expôs.

Editar:

RxJava2 Maybe:

RxJava2 adicionou um novo tipo chamado Maybe, Maybeé a combinação de Completablee Single.

Na mesma linguagem acima, Maybepode ser pensado como um método que retorna Optionalde algum tipo, Optionalé um invólucro em torno de Object que diz explicitamente se temos algum valor nele - Objectou não (em vez de nulo).
Com Maybepodemos ter algum valor exatamente igual Singleou não retornar nada - exatamente igual Completable. Além disso, como ambos, temos o erro.
Maybeé valioso quando queremos marcar que um Observablepode não ter um valor e apenas será concluído.
Um exemplo seria obtido do cache, não necessariamente teremos um valor no cache, portanto, neste caso, concluiremos, agora obteremos onNextcom o valor do cache.
Isso também é válido para lidar com valores não nulos em um fluxo com RxJava2.

RxJava2 Flowable:

Primeiro, vamos definir a contrapressão. A contrapressão é um meio de lidar com a situação em que os dados são gerados mais rapidamente do que podem ser processados. Flowabletem suporte de contrapressão permitindo que o downstream solicite itens. Você pode ler mais sobre as diferenças aqui .

Yosriz
fonte
2
E quanto a fluidos?
Niraj Chauhan
Portanto, se estou escrevendo em Kotlin, é Maybe<T>, essencialmente Single<T?>,?
AAverin,
Você pode considerar Singleum Completablecom valor retornado?
Eido95 de
13
  1. Flowable e Observable podem representar fluxos finitos ou infinitos. Fluida suporte back-pressão .
  2. Únicos são fluxos com um único elemento.
  3. Talvez sejam streams com 0 ou um elemento.
  4. Finalmente, um Completável representa um fluxo sem elementos, ou seja, ele só pode ser concluído sem um valor ou falhar.

Uma resposta concisa que encontrei aqui na seção RXJava.

Charith De Silva
fonte