RxJava执行过程是一个链条式的过程,中间可以自由的切换,默认不配置线程的时,默认上下游都在主线程,事件执行也是同步执行(上游发一次,西安下游就接收一次),如果配置了线程切换,则会变成异步执行
线程切换主要用到的操作符
- Schedulers.io():代表io操作流,网络操作,文件流,耗时操作
- Schedulers.newThread()常规的创建一个异步线程
- Schedulers.computation()代表CPU大量计算所需要的的线程
- AndroidSchedulers.mainThread():专门为Androidmain线程定制的
上游切换多次,只执行一次,下游切换多次执行多次,如示例2中所示
示例1:
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
}
});
示例2:
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
}
}).subscribeOn(Schedulers.io())//todo 给上游设置异步线程,只切换第一次,其他被忽略
.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//todo 给下游设置多次,每次都会切换
.observeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
}
});
示例3,下载一个图片进行显示到ImageView上的过程
String path="www.baidu.com";
Observable.just(path)
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
try {
return BitmapFactory.decodeResource(getResources()
,R.drawable.ic_launcher_background);
}catch (Exception e){
return null;
}
}
})
.observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Bitmap>() {
@Override
public void onSubscribe(Disposable d) {
//开始下载,显示加载中
}
@Override
public void onNext(Bitmap bitmap) {
//加载成功
}
@Override
public void onError(Throwable e) {
//加载失败时
}
@Override
public void onComplete() {
//关闭进度框
}
});
中间可以使用map操作符进行图片的各种变换及日志的记录操作,整个流程,链路清晰,功能拆分