tutorial single rxjava2 examples create completable java android reactive-programming rx-java2

rxjava2 - RxJava 2.x: ¿Debo usar Flowable o Single/Completable?



rx single (5)

Hmm ...

Creo que la pregunta no es trivial, mientras que te enfrentas a una situación más compleja.

P.ej. Guardar usuario (REST)> Guardar usuario (SQLlite)

Es posible que desee encadenar flujos de Rx en uno.

Así que o bien usted declara

1.

Flowable<Response<Void>> saveUser(String username, String hashedPassword, boolean logged, User user);

y luego use algunos de: flatMap, contactMap, switchMap

2.

... o creo que puede ser más preferible no confundir la responsabilidad de clase (puede usar el mismo código en muchos lugares)

Single<Response<Void>> saveUser(String username, String hashedPassword, boolean logged, User user); RestService.saveUser(...) .toFlowable() // Transform into Flowable .switchMap{ saveToDB() } .subscribeBy{ ... } .addTo( yourDisposable )

3.

Por cierto, sugiero que no utilices Completable en caso de que quieras tener un buen manejo de errores. Puede ajustar fácilmente Retrofit.Response<Body> en Single o Flowable para aprovechar la respuesta del código del servidor

Estoy desarrollando una aplicación para Android usando Clean Architecture y la estoy migrando a RxJava 2.x. Tengo que hacer algunas solicitudes de red a un servicio de jabón, así que definí la interfaz api en el módulo de dominio:

public interface SiginterApi { Observable<User> login(String user, String password); ... Observable<List<Campaign>> getCampaigns(List<Long> campaignIds); }

He leído que una solicitud de red debe hacerse con " Flowable ", debido a la gestión de la contrapresión, ya que es un "frío observable". Por otro lado, sé que el resultado de la solicitud será un éxito (con la respuesta) o un error, por lo que no sé si debo usar Flowable o Single o incluso Observable .

Además, tengo una base de datos de accesos como esta:

public interface UserRepository extends Repository { Observable<Void> saveUser(String username, String hashedPassword, boolean logged, User user); ... Observable<User> findUser(String username, String hashedPassword); }

No sé si debo usar Completable / Flowable / Observable en el método saveUser y Single / Flowable / Observable en el método findUser .


La cardinalidad es una forma de entender las diferencias entre Completable , Maybe y Single :

  • Un Maybe<T> es solo un Observable con cardinalidad 0 o 1, es decir, representa un resultado que puede estar presente o no.
  • Un Single<T> es un observable que siempre devuelve un resultado, es decir, una cardinalidad de 1.
  • Un Completable puede interpretarse como un Observable<Void> es decir, una cardinalidad de 0.

Entonces, en su caso, puede cambiar la firma del repositorio de esta manera:

Completable saveUser(...); Single<User> findUser(...);

(No mencioné los Flowable s que son como los Observable s con Backpressure ).


La contrapresión es lo que se obtiene cuando un Observable origen emite elementos más rápido de lo que un Subscriber puede consumirlos. Es más a menudo una preocupación con los observables calientes , no con los fríos , como lo solicita su red.

Creo que debería usar Completable lugar de Observable<Void> en su método saveUser , y usar Single para todos los lugares donde siga un patrón de solicitud / respuesta o entrada / salida. Observable debe usarse cuando realmente desee un flujo continuo de eventos.


Según tengo entendido, debe usar Single: cuando esté bastante seguro de que va a obtener un artículo, de lo contrario, obtendrá un error. Por ejemplo: GET - card /: id

Tal vez: es la solución correcta si no está tan seguro de obtener un artículo. Por ejemplo: GET - card? License-plate = xvar3

Completable: cuando solo quieres saber si se realizó la acción. Ej .: PUT o DETELE

Observable: cuando la cantidad de artículos no es tan grande.

Flujo: cuando no sepas la cantidad de artículos que recibirás.


Backpressure produce cuando un Observable emite elementos más rápidamente de lo que un operador o suscriptor puede consumirlos .

Sabiendo eso, la contrapresión no es un problema en su caso ya que su Observable emitirá solo un elemento, por lo que Flowable no es un buen candidato.

Por lo tanto, la pregunta real es si usar Completable u Observable para saveUser y Single u Observable para findUser y aquí, ya que solo se espera un resultado (éxito o fracaso) en aras de la simplicidad y claridad de su API, definitivamente debe usar Completable / Single de lo contrario, será difícil comprender que solo se emitirá un valor que podría ser engañoso para los usuarios de la API.