Опрос с использованием RXJava2/RXAndroid 2 и Retrofit

Я хотел бы реализовать службу опроса, которая вызывает API REST каждые nDelay Seconds и уведомляет всех подписчиков, если данные были изменены. Теперь у меня есть небольшая проблема с моим кодом, поскольку он всегда возвращает значение моему потребителю, даже если данные не были изменены.

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;
 }

Включение или использование DifferentUntilChanged ничего не меняет. Не имеет значения, поставлю ли я его до или после повтора.

Поскольку мой вызов RetroFit возвращает Observable, я должен использовать blockingSingle(). Использование Observable напрямую приводит к возврату элементов «4, 8, 12, 16, ..» с этим образцом:

LightManager.getInstance(context).getLights()
                            .repeatWhen(o -> o.concatMap(v -> Observable.timer(1, TimeUnit.SECONDS)))

В настоящее время я подписываюсь на разные классы / мероприятия с

   this.lightChangeSubscriber = PollingManager
                .getInstance(getContext())
                .getPollingLightsObservable()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(hueLights -> {
                    {
                        Log.d(TAG, "Lights received successfully! Size=" + hueLights.size());
                    }
                });

Я бы хотел избежать использования интерфейсов и таймера для создания опроса. Что ты посоветуешь ?


person Emanuel S    schedule 25.02.2017    source источник
comment
Попробуйте прочитать Learning RxJava для Android на github.com/kaushikgopal/RxJava-Android-Samples   -  person eurosecom    schedule 25.02.2017


Ответы (1)


как насчет использования какого-то пользовательского фильтра?

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...
   }
}
person Budius    schedule 25.02.2017
comment
Я только что изменил свой код, так как мой подписчик был скопирован из неправильного класса и недействителен ;-) Но да, использование фильтра должно делать то же самое, что и DifferentUntilChanged. Я думаю, что есть проблема при сравнении в DifferentUntilChanged, поскольку сравнение двух списков всегда верно, если размер одинаков? - person Emanuel S; 25.02.2017