Ich möchte einen Polling-Service implementieren, der alle nDelay Seconds eine REST Api aufruft und alle Teilnehmer benachrichtigt, wenn sich die Daten geändert haben. Jetzt habe ich ein kleines Problem mit meinem Code, da es immer einen Wert an meinen Consumer zurückgibt, auch wenn die Daten nicht geändert wurden.Polling mit RXJava2/RXAndroid 2 und Nachrüstung
private Observable<List<HueLight>> pollingLightsObservable = null;
public Observable<List<HueLight>> getPollingLightsObservable() {
if (pollingLightsObservable == null) {
pollingLightsObservable = Observable.fromCallable(
() -> LightManager
.getInstance(context)
.getLights()
.blockingSingle())
// .distinctUntilChanged((l1, l1) -> !l1.equals(l2))
.repeatWhen(o -> o.concatMap(v -> Observable.timer(1, TimeUnit.SECONDS)));
}
return pollingLightsObservable;
}
Aktivieren oder verwenden Sie distinctUntilChanged, ändern Sie nichts. Es spielt keine Rolle, ob ich es vor oder nach meiner Wiederholung stelle.
Da mein RetroFit Call ein Observable zurückgibt, muss ich blockingSingle() verwenden. Die beobachtbare direkt unter Verwendung führt sie in eine Rückkehr von "4, 8, 12, 16, .." Einzelteile mit diesem Beispiel:
LightManager.getInstance(context).getLights()
.repeatWhen(o -> o.concatMap(v -> Observable.timer(1, TimeUnit.SECONDS)))
Aktuell abonnieren i aus verschiedenen Klassen/Aktivitäten in mit
this.lightChangeSubscriber = PollingManager
.getInstance(getContext())
.getPollingLightsObservable()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(hueLights -> {
{
Log.d(TAG, "Lights received successfully! Size=" + hueLights.size());
}
});
Ich würde liebend vermeiden, Schnittstellen und Timer zu verwenden, um die Abfrage zu erstellen. Was würden Sie empfehlen ?
Try Learning RxJava für Android zu lesen, indem https://github.com/kaushikgopal/RxJava-Android-Samples – eurosecom