一:map
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
})
.map(new Function<Integer, Integer>() { // map 作用:处理转换发送的事件
@Override
public Integer apply(Integer integer) throws Exception {
return integer*10; //将每个值乘以10
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.i("zqq","accept>>"+integer); //输出结果
}
});
结果:
描述:经过map转换之后,每个结果都乘以10输出
map 参数Function<Integer, Integer> 泛型第一个表示:原数据类型 第二格表示转换后的数据类型
二:FlatMap
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onNext(4);
emitter.onComplete();
}
})
.flatMap(new Function<Integer, ObservableSource<String>>() { // flatMap 作用:将原Observable 转换为 新的 Observable<?>
@Override
public ObservableSource<String> apply(Integer integer) throws Exception { // 返回值为新的Observable Observable<T> implements ObservableSource<T>
StringBuilder sb=new StringBuilder();
sb.append(integer+" hello");
Observable<String> observable = Observable.just(sb.toString());
return observable;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String str) throws Exception {
Log.i("zqq","accept>>"+str);
}
});
输出结果:
源码说明:将转换函数应用于发出的每个项的结果,通过源ObservableSource并合并从中获得的ObservableSource的结果转变
flatmap,不保证原来事件发出的顺序性
三、concatMap
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onNext(4);
emitter.onComplete();
}
})
.concatMap(new Function<Integer, ObservableSource<String>>() { // flatMap 作用:将原Observable 转换为 新的 Observable<?>
@Override
public ObservableSource<String> apply(Integer integer) throws Exception { // 返回值为新的Observable Observable<T> implements ObservableSource<T>
StringBuilder sb=new StringBuilder();
sb.append(integer+" hello");
Observable<String> observable = Observable.just(sb.toString());
return observable;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String str) throws Exception {
Log.i("zqq","accept>>"+str);
}
});
输出结果:
contactMap 与 flatMap 类似,但是contactMap 保证原来事件的顺序性
作用
可以处理现实开发当中一些组合的事件,比如,注册后自动登录;列表多条数据更新后重新获取数据刷新;排序分类或者其他。
以注册后自动登录为例
请求接口
public interface UserApi{
@GET("/") //使用/或者. 来代替无接口
Observable<ResponseBody> register();
@GET("/") //使用/或者. 来代替无接口
Observable<ResponseBody> login();
}
请求事件
//没有接口,随便找个接口测试,是否进行了两次请求
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://www.tianqiapi.com/")
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
final UserApi userApi = retrofit.create(UserApi.class);
userApi.register()
.subscribeOn(Schedulers.io()) //io线程网络请求
.observeOn(AndroidSchedulers.mainThread()) //主线程处理结果
.doOnNext(new Consumer<ResponseBody>() { //注册请求的结果处理
@Override
public void accept(ResponseBody responseBody) throws Exception {
//注册成功后,处理结果,比如保存用户名
Log.i("zqq","注册成功后数据处理");
}
})
.observeOn(Schedulers.io()) //切换线程,用于登录的线程
.flatMap(new Function<ResponseBody, ObservableSource<ResponseBody>>() { //进行转换,去登录
@Override
public ObservableSource<ResponseBody> apply(ResponseBody responseBody) throws Exception {
Log.i("zqq","注册成功后,事件转换,自动登录");
return userApi.login(); //此处可判断注册结果是否成功,若失败可直接调用: Observable.error() ,让登录接收错误处理
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(ResponseBody responseBody) throws Exception {
Log.i("zqq","自动登录结果成功");
}
}, new Consumer<Throwable>() { //错误处理
@Override
public void accept(Throwable throwable) throws Exception {
}
});
返回结果: