zip一般用在某一个界面的数据通过不同的来源获取时。例如我们要展示一个页面,而这个页面的数据一部分是通过A接口获得的,另一部分是通过B接口获得的,还有一部分是本地文件读取的,那么这种场景下就可以使用zip操作符,将三方数据组合好后同时展示出来。 zip 有很多重载的方法。
public static <R> Observable<R> zip(Iterable<? extends Observable<?>> ws, FuncN<? extends R> zipFunction) { List<Observable<?>> os = new ArrayList<Observable<?>>(); for (Observable<?> o : ws) { os.add(o); } return Observable.just(os.toArray(new Observable<?>[os.size()])).lift(new OperatorZip<R>(zipFunction)); }
由于我的项目中批量上传的接口是同一个,只是参数不同。
Collection<Observable<HttpStatus>> subscribes = new ArrayList<>(); for(int i = 0;i<orders.length;i++){ Map<String, String> params = new HashMap<String, String>(); params.put("act", OConstants.DIS_ORDER); params.put("oi", orders[i]); params.put("destui", String.valueOf(destui)); Observable<HttpStatus> observable = RetrofitManager.getInstance().getApiService(OApiService.class).disOrder(params); subscribes.add(observable); } mCompositeSubscription.add(Observable.zip(subscribes, new FuncN<String>() { @Override public String call(Object... args) { StringBuffer stringBuffer = new StringBuffer(); for(int i=0;i<args.length;i++){ HttpStatus obj = (HttpStatus) args[i]; stringBuffer.append(obj.StateMsg+";"); } return stringBuffer.toString(); } }).compose(TransformUtils.defaultSchedulers()).subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { if (mvpView != null) { mvpView.hideLoading(); mvpView.showDisOrderFailed(e.getMessage()); } } @Override public void onNext(String s) { if (mvpView != null) { mvpView.hideLoading(); mvpView.showDisOrderSuccess(s); } } })); }