1.需求场景
同时向2个数据源获取数据,然后合并数据,同意展示到客户端。
2.具体实现
我们可以利用操作符Merge和zip实现上面的需求。
- 使用merge()操作符
Observable<String> network = Observable.just("网络");
Observable<String> file = Observable.just("本地文件");
Observable.merge(network, file)
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
Log.d(Constant.TAG, "数据源有:" + value);
result += value + "+";
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.d(Constant.TAG, "获取数据完成");
Log.d(Constant.TAG, result);
}
});
log信息:
07-03 13:20:19.346 11935-11935/com.gjj.frame D/RxJava: 数据源有:网络
07-03 13:20:19.346 11935-11935/com.gjj.frame D/RxJava: 数据源有:本地文件
07-03 13:20:19.346 11935-11935/com.gjj.frame D/RxJava: 获取数据完成
07-03 13:20:19.347 11935-11935/com.gjj.frame D/RxJava: 数据源来自 = 网络+本地文件+
- 使用zip()操作符
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(UrlManager.BASE_URL_JS)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RequestApi request = retrofit.create(RequestApi.class);
observable1 = request.getCall().subscribeOn(Schedulers.io());
observable2 = request.getCall_2().subscribeOn(Schedulers.io());
Observable.zip(observable1, observable2,
new BiFunction<TranslationBean, TranslationBean1, String>() {
@Override
public String apply(TranslationBean translationBean, TranslationBean1 translationBean1) throws Exception {
return translationBean.getContent().getOut() + " & " + translationBean1.getContent().getOut();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(Constant.TAG,"最终接收到的数据是:"+s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Logger.d("获取失败");
}
});
log信息:
07-03 13:21:36.981 12172-12172/com.gjj.frame D/RxJava: 最终接收到的数据是:嗨世界 & hi china
参考文章:
网友评论