RxJava的简单使用
#RxJava的简单使用
一个在Java VM上使用可观测的序列来组成异步的、基于事件的程序库
RxJava: https://github.com/ReactiveX/RxJava
RxAndroid: https://github.com/ReactiveX/RxAndroid
|
|
- Observable :被观察者(主题Subject)
- Observer/Subscriber :观察者
- Subscribe:订阅
Observable 和 Observer 通过subscribe()方法实现订阅关系
基本使用3部曲
1、创建Observeable
1234567Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {@Override public void subscribe(ObservableEmitter<String> emitter) throws Exception {emitter.onNext("Hello");emitter.onNext("world");emitter.onComplete();}});
- 2、创建Observer
|
|
- 3、订阅
|
|
##Scheduler线程控制
下面我们来模仿我们在用RxJava于Retrofit结合起来请求数据时的应用
|
|
我们创建User实体类
|
|
然后我们创建一个接口
|
|
接着我们在Activity中建一个button与一个textview来进行测试
|
|
在开始我们在RxJava的使用三部曲中订阅的时候并没有使用到.subscribeOn(Schedulers.io())与.observeOn(AndroidSchedulers.mainThread())这两个操作符,可是在这里为什么要使用呢,下面我们就来总结一下关于Scheduler的线程控制
- Schedulers.immediate();
- 直接在当前线程运行, 相当于不指定线程。这是默认的Scheduler。
- Schedulers.newThread();
- 总是启用新线程,并在新线程执行操作。
- Schedulers.io();
- I/O操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()。不要把计算工作放在io()中,可以避免创建不必要的线程。
- Schedulers.computation();
- 计算所使用的Scheduler。这个计算指的是CPU密集型计算,即不会被I/O等操作限制性能的操作,例如图形的计算。这个Scheduler使用的固定的线程池,大小为CPU核数。不要把I/O操作放在computation()中,否则I/O操作的等待时间会浪费CPU。
- AndroidSchedulers.mainThread();
- 它指定的操作将在Android主线程运行。
observeOn()指定Observer线程;
subscribeOn指定Observable线程
如果不添加.subscribeOn(Schedulers.io())这句,我们在调用api.getUserInfoWithPath获取用户信息的时候就会报NetworkOnMainThreadException这个异常,就是说我们不能在主线程中调用
然后我们在onNext方法中添加了text.setText(user.getUsername());这句,来更新UI的操作,所以我们必须要回到Android的主线程中,因此RxAndroid这个库就给我们提供了 .observeOn(AndroidSchedulers.mainThread())这个方法,因此就可以更新UI了
关于Rxjava的操作符有很多,我们接下来结合实际的案例来和大家一起学习