使用RXJava2/RXAndroid 2进行轮询及其改进
我想实现一个Pollingservice,它每nDelay秒调用一个RESTAPI,并在数据发生更改时通知所有订阅者。现在我的代码有点问题,因为它总是向我的消费者返回一个值,即使数据没有被更改使用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(
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...
}
}