Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RXJava2/RXAndroid 2进行轮询及其改进_Java_Android_Rx Android_Rx Java2 - Fatal编程技术网

使用RXJava2/RXAndroid 2进行轮询及其改进

使用RXJava2/RXAndroid 2进行轮询及其改进,java,android,rx-android,rx-java2,Java,Android,Rx Android,Rx Java2,我想实现一个Pollingservice,它每nDelay秒调用一个RESTAPI,并在数据发生更改时通知所有订阅者。现在我的代码有点问题,因为它总是向我的消费者返回一个值,即使数据没有被更改 private Observable<List<HueLight>> pollingLightsObservable = null; public Observable<List<HueLight>> getPollingLightsObservable(

我想实现一个Pollingservice,它每nDelay秒调用一个RESTAPI,并在数据发生更改时通知所有订阅者。现在我的代码有点问题,因为它总是向我的消费者返回一个值,即使数据没有被更改

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;
 }
目前,我从不同的类/活动订阅

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

我希望避免使用接口和计时器来创建轮询。您有什么建议?

使用一些自定义过滤器怎么样

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...
   }
}
公共类FilterDuplicateHueConfig实现谓词{
私人休息室;
@凌驾
公共布尔测试(HueConfig newVal){
if(lastVal==null){
lastVal=newVal;
返回true;
}
…在此处比较这两个值并适当地返回true/false。。。
}
}

我刚修改了我的代码,因为我的“订户”是从错误的类复制的,无效;-)但是,是的,使用过滤器也应该像distinctUntilChanged一样。我认为在distinctUntilChanged中比较存在一个问题,因为如果两个列表的大小相同,那么比较两个列表总是正确的?试着通过
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...
   }
}