#Rxjava
什么是Rxjava
RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)
最主要的是异步。响应式编程,事件流。好处是可以让代码更容易维护。
例如 :解决回调地狱
多个回调,层级多,阅读性特别差,那么用rxjava就会解决这样的问题。
Rxjava的原理是基于观察者模式
Rxjava的使用
引入
在项目的build.gradle
文件下添加
dependencies {
compile ‘io.reactivex:rxjava:1.3.0’
compile ‘io.reactivex:rxandroid:1.2.1’
}
- 创建Observer和Observable
- Observable订阅Observer 如:observable.subscribe(subscriber);
- Observable 产生事件数据逻辑
- Observer 消费事件
使用Rxjava了解几个概念Observable
(被观察者), Observer
(观察者),subscribe
(订阅)
Observable是被观察的对象,例如电影院的电影,Observer相当于观众,subscribe相当于影院将Observable和Observer联系起来。如电影发生了变化,观众就是会接受到变化。
简单的说,Observable相当发射数据源,Observer是接受处理数据的。
Observer的创建:
Observer是最基本的创建方式,下面的Subscriber也是实现了Observer,不过多了两个方法一个onStar,一个setProducer,和一个可以调用的unsubscribe的方法用于取消订阅。
如:观众.unsubscribe();
那么首先创建发射源就是Observable,它决定了什么时候触发事件及事件的规则:
Observable传入了一个OnSubscribe对象参数,这个参数会有一个回调方法call,call中的subsriber,就是你要给Observer(观众)传递的消息。依次序的发送你想执行的消息(例如 告诉观察者 电影开始了 ,电影很精彩,已经多了一个小时了,电影结束了)等当事件订阅是会自动调用call();
运行结果:
操作符
just from, 将多个数据一次一次发送完毕, 完毕后自动调用onCompleted,之后无法接受
使用于 数据已经备齐,然后发出。适合最终,不适合过程中。12Observable<String> observable=Observable.just("我是","just");observable.subscribe(subscriber);create():可以定制发送流程
- 其他操作符例子 其他操作符博客
线程调度
默认情况下 在哪个线成下订阅subscribe()
,就这哪个线程产生事件和消费事件。那么如何改变线程呢,如像Android中后台请求数据,主线程显示数据呢那就要用到
线程调度器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。
另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行
有两个方法可以对Scheduler做操作subscribeOn()
和observeOn()
,subscribeOn()事件产生的线程 和 observeOn() 事件消费的线程1234Observable<String> observable=Observable.just("我是","just").subscribeOn(Schedulers.io()). //指定发射源在那个线程(subscribe)observeOn(AndroidSchedulers.mainThread());//指定接受这在哪个线程(Observable)observable.subscribe(subscriber);
控制订阅发生在那个线程,回调后操作在那个线程。
部分回调
|
|
上面的代码可以,相当于一个Subscriber,但是写的更少更简洁。可以看出subscribe()
这个方法重载了多个。action0和action1两个部分函数的区别是
}
action0无参数和返回值,aciton1有参数无返回值。通过这两个方法可以替代Subscriber中的onNext
,onError
,onCompleted
的方法
学习资料
1.Rxjava详解
2.操作符大全博客