分享下Rxjava中map和flatMap:
首先说明一下RxJava的线程切换:Rx中的线程切换是用subscribeOn和observeOn来进行线程之间切换的
.subscribeOn(Schedulers.io())//此行代码表示此行代码上面的代码到上一个.subscribeOn或者observeOn为止都在IO线程中执行 ,当然如果将括号中的Schedulers.io()换成AndroidSchedulers.mainThread()的话则表示此行代码表示此行代码上面的代码到上一个.subscribeOn或者observeOn为止都在UI线程中执行
.observeOn(Schedulers.io())//此行代码表示此行代码下面的代码到下一个.subscribeOn或者observeOn为止都在IO线程中执行 ,当然如果将括号中的Schedulers.io()换成AndroidSchedulers.mainThread()的话则表示此行代码表示此行代码下面的代码到下一个.subscribeOn或者observeOn为止都在UI线程中执行
举个例子:
例子一:
private void testttt(){
Disposable disposable = Observable.just("test")
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {//此方法是在子线程中执行
//此方法是在子线程中执行这里的参数s就是上面的"test"字符串
//在Rxjava中每个操作符的入参类型就是上一个操作符的返回参数类型(比如这段代码中的map和flatMap就是操作符)
//在这里我就简单的写一下,假设对参数s进行了N轮操作后最终返回了s的长度
return s.length();
}
})
.subscribeOn(Schedulers.io())//此行代码表示此行代码上面的代码到上一个.subscribeOn或者observeOn为止都在IO线程中执行 ,当然如果将括号中的Schedulers.io()换成AndroidSchedulers.mainThread()的话则表示此行代码表示此行代码上面的代码到上一个.subscribeOn或者observeOn为止都在UI线程中执行
.observeOn(AndroidSchedulers.mainThread())//此行代码表示此行代码下面的代码到下一个.subscribeOn或者observeOn为止都在IO线程中执行 ,当然如果将括号中的Schedulers.io()换成AndroidSchedulers.mainThread()的话则表示此行代码表示此行代码下面的代码到下一个.subscribeOn或者observeOn为止都在UI线程中执行
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {//此方法是在主线程中执行
//此方法是在主线程中执行这里的参数integer就是上面的s.length()所返回的值
//在Rxjava中每个操作符的入参类型就是上一个操作符的返回参数类型(比如这段代码中的map和flatMap就是操作符)
//在这里我就简单的写一下,假设这里又把integer参数给转换成String返回给下一层
return String.valueOf(integer);
}
})
.observeOn(Schedulers.io())
.map(new Function<String, Boolean>() {
@Override
public Boolean apply(String s) throws Exception {//此方法是在子线程中执行
//此方法是在子线程中执行这里的参数 s就是上面的String.valueOf(integer)所返回的值
//在Rxjava中每个操作符的入参类型就是上一个操作符的返回参数类型(比如这段代码中的map和flatMap就是操作符)
//在这里我就简单的写一下,假设这里我们执行完我们的逻辑之后需要返回一个true
return true;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {//此方法在主线程中执行
//此方法在主线程中执行这里的参数 aBoolean就是上面的返回的true
//至此我们就可以在这里写我们最终需要在主线程中执行的代码逻辑了
}
});
//最后在我们页面结束的时候记得调用下面的代码来中断Rxjava中流程的传递,不然的话很容易造成内存泄漏
if(disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
例子二:
private void testee(){
//这里假设我有一个需求是将一个size为10的存放int型0到9的list转换成一个size为10存放String类型"0"..."9"
//我们使用Rxjava来做的话可以来写
ArrayList<Integer> testList = new ArrayList<>();
for (int i = 1 ; i < 10 ; i++){
testList.add(i);//这里只是编造原始数据
}
Disposable disposable = Observable.just(testList)
.flatMap(new Function<ArrayList<Integer>, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(ArrayList<Integer> integers) throws Exception {
ArrayList<String> strList = new ArrayList<>();
for (Integer integer : integers) {
strList.add(String.valueOf(integer));
}
return Observable.fromIterable(strList);//使用FlatMap时返回值最好使用Observable进行操作
}
})
.flatMap(new Function<String, ObservableSource<Boolean>>() {
@Override
public ObservableSource<Boolean> apply(String s) throws Exception {
//此方法会执行上面flatMap中strList.size()次,每次的s就是strList的一个Item
//执行strList.size()次就相当于对strList进行遍历
//此方法可以对s字符串(此s字符串就相当于上面的flapMap中的strList的每个item)
//假设每次执行完该方法都返回false
return Observable.just(false);
}
})
// .map(new Function<String, Boolean>() {
// @Override
// public Boolean apply(String s) throws Exception {
// //此方法会执行上面flatMap中strList.size()次,每次的s就是strList的一个Item
// //执行strList.size()次就相当于对strList进行遍历
// //此方法可以对s字符串(此s字符串就相当于上面的flapMap中的strList的每个item)
// //假设每次执行完该方法都返回false
// return false;
// }
// })//次端注释代码跟上面的flatMap在功能上是等价的
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
//这里也会执行flatMap中strList.size()次
System.out.println(aBoolean);//最终执行完整个流程之后在控制台会打印10个false
}
});
//最后在我们页面结束的时候记得调用下面的代码来中断Rxjava中流程的传递,不然的话很容易造成内存泄漏
if(disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}