Java Forum 2019 | Johannes Schneider | cedarsoft.com
Rx-Java 2
von 0 auf 100 in 45 min
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Das Ziel:“Ist doch eigentlich ganz einfach”
“Dafür hätte ich nicht so lange da bleiben müssen”
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Jetzt geht es wirklich los!
Warum Reactive Programming?
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Szenario 1Verbindungsaufbau
Steuerung
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 1(-3): Port-Guessing (80?, 443?, 8080?)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 4: PLC-Infos abrufen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 5: Berechtigungs-Infos
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 6: Daten-Modell
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 7: Visu-Modell
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 8: Customizations
Java Forum 2019 | Johannes Schneider | cedarsoft.com
GET 9: Initiale Daten
Java Forum 2019 | Johannes Schneider | cedarsoft.com
9(+) Requests à 30 ms → kein Problem
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aber: VPN + Mobilfunk → ...
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Was tun? Klar: Parallelisieren
Java Forum 2019 | Johannes Schneider | cedarsoft.com
→ Observer-Pattern / Callbacks (???)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aber: Calls bauen (teilweise) aufeinander auf
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Welcome to Callbacks-Hell
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Szenario 2UI-Anbindung
(Android, Swing, JavaFX)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aktionen im Hintergrund
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aber: Progress anzeigen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aber: Abbrechen durch Benutzer
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Update der UI nur im UI-Thread
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aber: Nicht zu viele Updates der UI!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Observer-Pattern (???)
Eigentlich richtig - in der Praxis zu kompliziert
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Vorlesung “Design Patterns”
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Typisches Pattern: 90% Pattern - 10% Probleme / Grenzen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Observer-Pattern10% Pattern - 90% Probleme / Grenzen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Niemand implementiert das “richtig”
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Was dem Observer-Pattern fehlt...
… löst Reactive Programing
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Schritt 1
aus Sicht des Observers
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Grundsätzlicher Ansatz Reactive:
return Observable
Wenn du nicht mehr weiter weißt, füge einen Layer ein...
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Grundprinzip
public Observable<String> fetchBestMovies(){...}
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Noch ist nix passiert
public Observable<String> fetchBestMovies(){...}
Observable<String> myObservable = fetchBestMovies();
Noch ist nix passiert! Methode läuft noch nicht.
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Jetzt geht es los!
public Observable<String> fetchBestMovies(){...}
Observable<String> myObservable = fetchBestMovies();
//...
myObservable.subscribe([...]);
Hier geht es (erst) los!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback
myObservable.subscribe(new Observer<String>(){
[...]
});Das eigentliche Callback.
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Jetzt geht es los
myObservable.subscribe(new Observer<String>(){
public void onSubscribe(Disposable d) { }
public void onNext(String s) {}
public void onError(Throwable e) {}
public void onComplete() {}
});
Ganz am Anfang 1x aufgerufen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
“Normale” Listener-Methode
myObservable.subscribe(new Observer<String>(){
public void onSubscribe(Disposable d) { }
public void onNext(String s) {}
public void onError(Throwable e) {}
public void onComplete() {}
});
Call für jedes Element
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Fehlerbehandlung
myObservable.subscribe(new Observer<String>(){
public void onSubscribe(Disposable d) { }
public void onNext(String s) {}
public void onError(Throwable e) {}
public void onComplete() {}
});
Falls ein Fehler auftritt
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Habe fertich
myObservable.subscribe(new Observer<String>(){
public void onSubscribe(Disposable d) { }
public void onNext(String s) {}
public void onError(Throwable e) {}
public void onComplete() {}
});
Damit wird gemeldet, dass keine Elemente mehr kommen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Abbruch durch Consumer (z.B. UI-Interaktion)
myObservable.subscribe(new Observer<String>(){ @Override public void onSubscribe(Disposable d) {
//Remember that disposable }[...]});
disposable.dispose();
Observer kann (irgendwann) abbrechen!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback auf welchem Thread?
Observer entscheidet!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback auf welchem Thread?
public Observable<String> fetchBestMovies(){...}
Observable<String> myObservable = fetchBestMovies();
myObservable.observeOn(SwingScheduler.INSTANCE).subscribe();
Wir “observieren” auf dem Swing Thread
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback auf welchem Thread?
public Observable<String> getFunnyNames(){...}
Observable<String> myObservable = getFunnyNames();
myObservable.observeOn(Schedulers.IO).subscribe();
Wir “observieren” auf einem (großen) Thread-Pool
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback auf welchem Thread?
public Observable<String> getFunnyNames(){...}
Observable<String> myObservable = getFunnyNames();
myObservable.observeOn(Schedulers.COMPUTE).subscribe();
Wir “observieren” auf einem Thread-Pool mitGröße == Anzahl Kerne
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Callback auf welchem Thread?
public Observable<String> fetchBestMovies(){...}
Observable<String> myObservable = fetchBestMovies();
myObservable.observeOn(Schedulers.COMPUTE).subscribe();
Jeder Call wrappt das ursprüngliche Observable!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Demo 1
Hello World - aus Observer-Sicht
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Wiederholung Basics
Wie war das noch?
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Observable zurück geben
return Observable
Anstatt wie klassisch ein Callback zu übergeben
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Erst bei subscribe()Geht die Reise los
Dadurch mehr Kontrolle / Konfigurationsmöglichkeit beim Aufrufer
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Alles da was wir brauchen
Übliche Methoden sind vorhanden
onNext(T)
onError(Throwable)
onComplete()
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Threading ist gelöst
(auch eigene Schedulers möglich)
observeOn(Scheduler)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Observer kann abbrechen
Disposable
Z.B. beim Verlassen einer Seite...
Falls ein anderer Server schneller antwortet...
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Schritt 2
aus Sicht des “Observable”
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Grundsätzlicher Ansatz Reactive:
return Observable
Wenn du nicht mehr weiter weißt, füge einen Layer ein...
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Aus Sicht des Observierten
public Observable<String> fetchBestMovies(){
[...]
//Hier passiert noch nichts teures/langes
return observable;
}Schnell zurückkehren! Keine Arbeit direkt machen!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Erst bei subscribe() geht es los
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Vorsicht!Oder: Was (fast) alle Tutorials falsch machen!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Macht das Sinn??? Deshalb Rective???
public Observable<String> fetchBestMovies(){
return Observable.fromArray(“a”, “b”, “c”);
}
Schnell zurückkehren??? Keine Arbeit direkt machen???
Brauche ich dafür eine fette Bibliothek???
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Das ist ein (sinnfreies) Beispielum ein Observable zu bekommen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Besseres Minimal-Beispiel
Java Forum 2019 | Johannes Schneider | cedarsoft.com
→ Eigentlich lohnt es sich jetzt schon
Aber das Beste kommt ja noch
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Reactive Operatoren
Java Forum 2019 | Johannes Schneider | cedarsoft.com
(zu) hohe Frequenz?
Throtteling ist schon da
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Bitte etwas langsamer!
fetchBestMovies().throttleLatest(500L, TimeUnit.MILLISECONDS, true).observeOn(SwingScheduler.INSTANCE) //Maybe a ui thread?
.subscribe(new Observer<String>() {
Liefert den letzten/jüngsten Wert alle 500 ms
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Demo 3
Operatoren, Operatoren, Operatoren
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Operatoren sind schwer zu verstehendeshalb:
https://rxmarbles.com/
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Typen von “Observables”Observable / Flowable
Maybe / Single / Completable
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Szenario 3Pagination für eine Suche
Endless Loading
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Eine Query mit vieeeeeeeeeeelen Results
Java Forum 2019 | Johannes Schneider | cedarsoft.com
UI entscheidet, wann die nächste Seite kommt
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Demo Flowable
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Alles perfekt?
Naja...
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Performance(!?)
Kein Ersatz für For-Schleifen!
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Debugging
Laaaange StackTraces
wie früher bei Hibernate ;-)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Komplexität, Komplexität
“Aus vielen Operatoren folgt große Verantwortung”
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Best Practices
Was “unbedingt” zu empfehlen ist
Java Forum 2019 | Johannes Schneider | cedarsoft.com
observeOn() wird häufig benötigt
Java Forum 2019 | Johannes Schneider | cedarsoft.com
… subscribeOn() sehr selten
Java Forum 2019 | Johannes Schneider | cedarsoft.com
doOn…()-Methoden sind sehr hilfreich
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Operatoren: Möglichst mit Einzeilern(vergleiche Streaming API)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Abstrakte Basis-Klassen für Observer erstellen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Es gibt für alles bereits einen Operator ;-)
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Demos / Tests erstellen
Java Forum 2019 | Johannes Schneider | cedarsoft.com
Fragen / Anregungen / Ergänzungen?
Demo Code unter:
https://github.com/jschneider/rxjava2-examples
Top Related