Я хотел бы реализовать службу опроса, которая вызывает 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());
}
});
Я бы хотел избежать использования интерфейсов и таймера для создания опроса. Что ты посоветуешь ?