1.zip 概述
zip()
合并两个或者多个Observables发射出的数据项,根据指定的函数Func*变换它们,并发射一个新值。下图展示了zip()
方法如何处理发射的“numbers”和“letters”然后将它们合并一个新的数据项。
从上图结果来看,发射器1中的数据“5”在合并后抛弃了,它只发射与发射数据项最少的那个Observable一样多的数据,即Observable1有5个数据,Observables2有4个数据,最终合并只有4个数据。结果集是以发送时最少的为主输出合并数量
2.实际应用
- 需求:
- 从不同数据源(2个服务器)获取数据,即 合并网络请求的发送
- 统一显示结果
例如:
一个界面需要展示用户的一些信息, 而这些信息分别要从两个服务器接口中获取, 而只有当两个都获取到了之后才能进行展示。
- 实现:
Observable<UserBaseInfoResponse> observable1 =
api.getUserBaseInfo(new UserBaseInfoRequest()).subscribeOn(Schedulers.io());
Observable<UserExtraInfoResponse> observable2 =
api.getUserExtraInfo(new UserExtraInfoRequest()).subscribeOn(Schedulers.io());
Observable.zip(observable1, observable2,
new BiFunction<UserBaseInfoResponse, UserExtraInfoResponse, UserInfo>() {
@Override
public UserInfo apply(UserBaseInfoResponse baseInfo,
UserExtraInfoResponse extraInfo) throws Exception {
return new UserInfo(baseInfo, extraInfo);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<UserInfo>() {
@Override
public void accept(UserInfo userInfo) throws Exception {
//do something;
}
注:
Zip
操作符里面的两个请求串行实行的,如需需要并发执行,可以给每个流追加一个调度器。详见 https://www.jianshu.com/p/422ffdd80c06
网友评论