我想实现一个Pollingservice,它在每个nDelay Seconds调用REST Api,并在数据被更改时通知所有订阅者。现在我的代码有点问题,因为它总是向我的Consumer返回一个值,即使数据没有被更改。
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;
}
启用或使用distinctUntilChanged不要更改任何内容。如果我在我的重复之前或之后把它放在了什么地方。
由于我的RetroFit Call返回一个Observable,我必须使用blockingSingle()。直接使用Observable会导致返回&#34; 4,8,12,16,...&#34;带有此示例的项目:
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());
}
});
我很乐意避免使用接口和计时器来创建轮询。你会推荐什么?
答案 0 :(得分:0)
使用一些自定义过滤器怎么样?
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...
}
}