最近有个需求,判断三个Observable哪一个最先返回(最要是测试3个地址的网络返回速度),本来很简单的需求使用merge或amb这样的其中一个方法就能判断哪个地址最先返回,但有点郁闷的就是这三个地址返回值是一样的,所以用上面的方法不能实现判断哪个Observable最先返回,下面是后来实现的代码:
ss_GetUsed_SITE= Observable.combineLatest(
GetRetrofit.getRetrofit(B64.dec(SITE1)).create(ImeiService.class).getSITE1().startWith("begin"),
GetRetrofit.getRetrofit(B64.dec(SITE2)).create(ImeiService.class).getSITE2().startWith("begin"),
GetRetrofit.getRetrofit(B64.dec(SITE3)).create(ImeiService.class).getSITE3().startWith("begin"),
newFunc3() {
@Override
publicString call(String s, String s2, String s3) {
if(s.equals("ok"))
{
returnB64.dec(SITE1);
}
else if(s2.equals("ok"))
{
returnB64.dec(SITE2);
}
else if(s3.equals("ok"))
{
returnB64.dec(SITE3);
}
return null;
}
})
.subscribeOn(Schedulers.io())
.subscribe(newObserver() {
@Override
public voidonCompleted() {
}
@Override
public voidonError(Throwable e) {
}
@Override
public voidonNext(String s) {
if(s !=null)
{
if(ss_GetUsed_SITE!=null)
{
ss_GetUsed_SITE.unsubscribe();
}
if(onlineWebSite==null)
{
onlineWebSite= s;
}
seachByIMEI(null);
}
}
});
现在看到了,使用的是combineLatest方法,由于combineLatest方法第一次回调需要三个Observable全有返回值才能产生,所以每个Observable都加入了一个startwith方法用来产生回调,之后通过Fun中的参数值就能判断哪个Observable最先返回。
网友评论