Lazy fetching von paginierten Objekten mit RxJava

8

Ich bin fast an RxJava verkauft worden, was ein perfekter Begleiter für Retrofit ist, aber ich kämpfe bei der Migration meines Codes in ein gemeinsames Muster: um Bandbreite zu sparen, möchte ich (paginierte) Objekte aus meiner Webservice nach Bedarf, während meine Listview (oder Recyclerview) mit reaktiver Programmierung scrollt.

Mein vorheriger Code hat den Job perfekt gemacht, aber reaktive Programmierung scheint den Versuch wert.

Listening / Recyclerview scrollen (und andere langweilige Dinge) ist nicht das Problem und das Erhalten eines Observable ist einfach mit Retrofit:

%Vor%

Ich kann einfach nicht herausfinden, welches Muster ich für die reaktive Programmierung verwenden soll.

Der Concat -Operator scheint ein guter Ausgangspunkt zu sein, zusammen mit ConnectableObservable irgendwann zu verzögern Emissionen und vielleicht flatMap , aber wie?

BEARBEITEN:

Hier ist meine aktuelle (naive) Lösung:

%Vor%

Und meine Implementierung mit einem Thema:

%Vor%     
Renaud Cerrato 10.02.2015, 09:39
quelle

1 Antwort

5

Hier ist eine von ein paar möglichen Möglichkeiten, reaktives Paging zu handhaben. Angenommen, wir haben eine Methode getNextPageTrigger , die ein Observable zurückgibt, gibt ein Ereignisobjekt aus, wenn der Scroll-Listener (oder eine andere Eingabe) eine neue Seite laden möchte. Im echten Leben hätte es wahrscheinlich den Operator debounce , aber zusätzlich werden wir sicherstellen, dass wir es erst auslösen, nachdem die letzte Seite geladen wurde.

Wir definieren auch eine Methode, die Nachrichten aus ihrer Liste auszupacken:

%Vor%

Dann können wir die eigentliche Abruflogik machen:

%Vor%

Es fehlen noch ein paar potentiell wichtige Dinge:

1 - Das weiß natürlich nicht, wann man keine weiteren Seiten mehr abholen soll. Das bedeutet, wenn das Ende erreicht ist, je nachdem, was der Server zurückgibt, kann es bei jedem Scrollen Fehler oder leere Ergebnisse anzeigen. Lösungsansätze hängen davon ab, wie Sie dem Client signalisieren, dass keine weiteren Seiten geladen werden müssen.

2 - Wenn Sie Fehler wiederholen müssen, würde ich vorschlagen, in den Operator retryWhen zu schauen. Andernfalls können häufige Netzwerkfehler dazu führen, dass beim Laden einer Seite ein Fehler auftritt.

    
lopar 22.02.2015, 09:58
quelle