2017-02-25 3 views
0

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 ?

+0

Try Learning RxJava für Android zu lesen, indem https://github.com/kaushikgopal/RxJava-Android-Samples – eurosecom

Antwort

0

was ist mit einigen benutzerdefinierten Filter?

public class FilterDuplicateHueConfig implements Predicate<HueConfig> { 

    private HueConfig lastVal; 
    @Override 
    public boolean test(HueConfig newVal) { 
     if(lastVal == null) { 
     lastVal = newVal; 
     return true; 
     } 
     ... compare here the two values and return true/false appropriately... 
    } 
} 
+0

ich hve meinen Code, da mein „Teilnehmer“ nur modifiziert wurde von der falschen Klasse kopiert und ist nicht gültig ;-) Aber ja, Filter sollten dasselbe tun wie distinctUntilChanged. Ich denke, es gibt ein Problem Vergleich in der distinctUntilChanged seit dem Vergleich von zwei Listen sind immer wahr, wenn die Größe gleich ist? –