rxjava初学
二、
上下游默认是在同一个线程工作
我们需要先改变上游发送事件的线程, 让它去子线程中发送事件, 然后再改变下游的线程, 让它去主线程接收事件. 通过RxJava内置的线程调度器可以很轻松的做到这一点
observable.subscribeOn(Schedulers
observable.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(consumer);
subscribeOn()
指定的是上游发送事件的线程, observeOn()
指定的是下游接收事件的线程.
多次指定上游的线程只有第一次指定的有效, 也就是说多次调用subscribeOn()
只有第一次的有效, 其余的会被忽略.
多次指定下游的线程是可以的, 也就是说每调用一次observeOn()
, 下游的线程就会切换一次.
Rxjava内置线程调度器
- Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
- Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
- Schedulers.newThread() 代表一个常规的新线程
- AndroidSchedulers.mainThread() 代表Android的主线程
如果在请求的过程中Activity已经退出了, 这个时候如果回到主线程去更新UI, 那么APP肯定就崩溃了, 怎么办呢?
可以在Activity中将这个Disposable
保存起来, 当Activity退出时, 切断它即可
如果有多个Disposable
该怎么办呢?
RxJava中已经内置了一个容器CompositeDisposable
, 每当我们得到一个Disposable
时就调用CompositeDisposable.add()
将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear()
即可切断所有的水管.
例子:
1.rxjava 和retrofit实现网络请求
2.rxjava 操作数据库ccccc
3.先注册 后登陆 (连环请求 或者嵌套请求 怎么写)?
①分别写在2个人法中(不够优雅)
②(优雅)flatMap
登录和注册返回的都是一个上游Observable, 而我们的flatMap操作符的作用就是把一个Observable转换为另一个Observable, 因此
api.register(new RegisterRequest()) api.register(new RegisterRequest()) //发起注册请求
.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求注册结果
.doOnNext(new Consumer() {
@Override
public void accept(RegisterResponse registerResponse) throws Exception {
//先根据注册的响应结果去做一些操作
}
})
.observeOn(Schedulers.io()) //回到IO线程去发起登录请求
.flatMap(new Function>() {
@Override
public ObservableSource apply(RegisterResponse registerResponse) throws Exception {
return api.login(new LoginRequest());
}
})
.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求登录的结果
.subscribe(new Consumer() {
@Override
public void accept(LoginResponse loginResponse) throws Exception {
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
}
});
③
Map(类似装饰模式?)
map是RxJava中最简单的一个变换操作符了, 它的作用就是对上游发送的每一个事件应用一个函数, 使得每一个事件都按照指定的函数去变化
FlatMap
将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里.
上游每发送一个事件, flatMap都将创建一个新的水管, 然后发送转换之后的新的事件, 下游接收到的就是这些新的水管发送的数据. 这里需要注意的是, flatMap并不保证事件的顺序, 也就是图中所看到的, 并不是事件1就在事件2的前面. 如果需要保证顺序则需要使用concatMap
.
doOnNext() 执行在订阅者的onNext()方法之前,创建型之后。
- 订阅者onSubscribe main
- map io
- 被观察者subscribe ,执行完发送事件 io
- flatmap 1 main
- flatmap 2 main
- doOnNext&accept() main
- onNext main
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!