2017-03-01 4 views
19

Ich entwickle eine Android App mit Clean Architecture und ich migriere sie nach RxJava 2.x. Ich muss einige Netzwerkanforderungen an eine Seifen Service machen, so I definiert die API-Schnittstelle im Bereich Modul:RxJava 2.x: Soll ich Flowable oder Single/Compleable verwenden?

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

ich, dass eine Netzwerkanfrage gelesen haben sollte mit „Flowable“ gemacht werden, weil der Gegendruck Management, da es "kalt beobachtbar" ist. Auf der anderen Seite weiß ich, das Ergebnis der Anfrage wird Erfolg (mit der Antwort) oder Fehler, so dass ich nicht weiß, ob ich Flowable oder Single oder sogar Observable verwenden sollte.

Außerdem habe ich eine Datenbank wie diese Zugriffe:

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

Ich weiß nicht, ob ich Completable/Flowable/Observable in saveUser Verfahren und Single/Flowable/Observable in findUser Methode verwendet werden soll.

Antwort

16

Gegendruck ist, was Sie bekommen, wenn eine Quelle Observable Elemente schneller ausgibt als ein Subscriber kann sie verbrauchen. Es ist am häufigsten ein Problem mit heißen Observablen, nicht kalten diejenigen wie Ihre Netzwerkanforderungen.

Ich glaube, Sie Completable statt Observable<Void> in Ihrem saveUser Methode verwenden sollten, und verwenden Sie Single für alle Orte, an denen Sie eine Anforderung/Antwort oder Eingabe/Ausgabe-Muster folgen. Observable sollte verwendet werden, wenn Sie tatsächlich einen kontinuierlichen Datenstrom von Ereignissen wünschen.

+0

Danke für die Antwort. Ich stimme zu, dass 'Single' die bessere Option ist, um Anfragen zu vernetzen, wegen der einzelnen Antwort, aber wie Sie in dieser [Frage] (http://stackoverflow.com/a/40326875/6389621) und vielen anderen Blogs lesen können Über RxJava 2.x sollten Netzwerk- und Datenbank-Accessoren mit 'Flowable' erstellt werden. –

+1

Ich glaube, der Autor bezieht sich auf Netzwerk- und Datenbankverbindungen, die sich wie ein Strom von Ereignissen verhalten. Wenn ich das richtig verstehe, ist das anders als bei einem HTTP-Anfrage/Antwort-Paar oder einer einzelnen Datenbankabfrage. – npace

+0

Also denken Sie, dass der Schlüssel zwischen einem 'Observable' (' Single'/'Completable') und' Flowable' zu ​​entscheiden ist, ob Sie eine Gegendruckkontrolle benötigen oder nicht. Der Quelltyp (Kaltquelle, Netzwerk-/Datenbank-Accessoren ...) ist davon nicht betroffen. –

11

Backpressure tritt auf, wenn ein Observable wird Artikel schneller als einem Betreiber oder Teilnehmer emittieren können sie verbrauchen.

Wissen, dass Gegendruck kein Problem in Ihrem Fall ist, da Ihre Observable nur ein Element emittieren wird, so Flowable ist kein guter Kandidat.

So ist die eigentliche Frage ist, ob Completable oder Observable für saveUser und Single oder Observable für findUser zu nutzen und hier nur als ein Ergebnis zu erwarten ist (Erfolg oder Misserfolg) aus Gründen der Einfachheit und Klarheit der API, sollten Sie definitiv Verwenden Sie Completable/Single, andernfalls ist es schwer zu verstehen, dass nur ein Wert ausgegeben wird, der für Ihre API-Benutzer irreführend sein könnte. Hmm

+0

Danke für die Antwort. Ich stimme zu, dass 'Single' die bessere Option ist, um Anfragen zu vernetzen, wegen der einzelnen Antwort, aber wie Sie in dieser [Frage] (http://stackoverflow.com/a/40326875/6389621) und vielen anderen Blogs lesen können Über RxJava 2.x sollten Netzwerk- und Datenbank-Accessoren mit 'Flowable' erstellt werden. –

+0

[Wann Flowable zu verwenden ist] (https://github.com/ReactiveX/RxJava/wiki/What-different-in-2.0 # wann zu verwenden-fließfähig). Das mit db access zusammenhängende Beispiel ist I quote * Das Lesen von einer Datenbank über JDBC ist ebenfalls blockierend und pull-basiert und wird von Ihnen gesteuert, indem 'ResultSet.next() 'für jede Downstream-Anfrage aufgerufen wird. * In diesem Fall lesen wir die db und wir haben mehrere Ergebnisse, die nicht Ihr Fall ist, und wenn Sie das Dokument gut überprüfen, ist die Frage mehr, was zwischen "Observable" und "Flowable" zu wählen, wenn Sie mehrere Elemente haben, um zu emittieren –

0

...

Ich denke, die Frage ist nicht trivial ist eine Weile, Sie Gesicht komplexere Situation haben.

Eg. Benutzer speichern (REST)> Speichern Benutzer (SQLlite)

Sie können Kette wollen Rx in einen Streams.

Also entweder erklären Sie

1.

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

und dann einige verwenden: flatMap, contactMap, switchMap

2.

... oder ich denke, kann mehr vorzuziehen nicht Klasse Verantwortung zu verwechseln (Sie den gleichen Code in vielen Orten verwenden)

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

RestService.saveUser(...) 
.toFlowable() // Transform into Flowable 
.switchMap{ saveToDB() } 
.subscribeBy{ ... } 
.addTo(yourDisposable) 

3.

By the way Ich schlage vor, Verwenden Sie Complect nicht im Fall, wenn Sie eine gute Fehlerbehandlung wünschen. Sie können leicht Retrofit.Response<Body> in Single oder Flowable wickeln Vorteil der Codes Antwort vom Server

0

zu nehmen, wie ich verstehe, sollen Sie Einzel verwenden: wenn Sie ziemlich sicher sind, dass Sie ein Element in Gang bringen, sonst würden Sie bekommen ein Fehler. ZB: GET - Karte /: ID

Vielleicht: ist die richtige Lösung, wenn Sie nicht so sicher sind, wenn Sie einen Artikel bekommen. ZB: GET - Karte? Nummernschild = xvar3

Vervollständigbar: wenn Sie nur wissen möchten, ob die Aktion durchgeführt wurde. ZB: PUT oder DETELE

Observable: wenn die Menge der Artikel nicht so groß ist.

Fließbar: wenn Sie nicht die Menge der Artikel, die Sie erhalten, konw.

Verwandte Themen