使用RXJava2 / RXAndroid 2和Retrofit进行轮询

时间:2017-02-25 16:16:02

标签: java android rx-android rx-java2

我想实现一个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());
                    }
                });

我很乐意避免使用接口和计时器来创建轮询。你会推荐什么?

1 个答案:

答案 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...
   }
}