标签:
之前就知道有RxJava这玩意,知道这玩意很屌,不过也就止于看看标题,看几段介绍的程度(懒癌害人不浅)。
这周心血来潮,抽空把之前收藏的 扔物线 大神写的RxJava入门文章看了。
花了一晚上看完,顺便做做笔记,然后试着把上传和压缩图片的逻辑改用RxJava实现。
发现真的用得很爽。屌爆了。整个流程一口气写完,不需要在Handler中跳来跳去,还自带线程调度,真棒。
下面是乱写的笔记,有些是直接Ctrl+C,Ctrl+V的,记得乱七八糟,估计也就我自己清楚这笔记写的是什么鬼了(其实就是就为了水篇博客而已,手动滑稽)。
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
写笔记时的最新版:compile ‘io.reactivex:rxjava:1.0.14‘compile ‘io.reactivex:rxandroid:1.0.1‘
RxJava主要用到观察者模式,观察者和被观察者通过订阅完成绑定。
在程序中,观察者无法或者不好去主动(即定时查询,这样比较浪费性能,而且不及时)去获取被观察者的状态。
一般是在被观察者发生事件时,再去通知观察者。虽然这和现实的情况有点区别。
->实现被观察者,绑定事件
—>实现观察者,定义事件的响应
—->观察者订阅事件(被观察者.subscribe(观察者))
——>被订阅者开始发送事件
Observable:被观察者通过create()、just()、from()来绑定(输入)事件来构造被观察者对象
通过subscribe()跟观察者并联,并开始向观察者发送事件
通过map(),将输入的事件进行转换(加工)成另一个事件,返回结果给观察者响应
flatMap(),可以将输入的事件进行转换(加工)成其他事件(1转1,或者1转多),将新事件绑定到新的被观察者,构成新的被观察者对象,返回此新被观察者对象
(之后会由新被观察者发事件给观察者,所以subscribe()的时候,需要注意观察者响应的是事件类型,要跟新观察者一致)
lift()对目标订阅者进行层层包装,通过Observable.Operator,让包装后的订阅者可以直接处理事件。compose()是对多个lift()的封装
throttleFirst() 在每次事件触发后的一定时间间隔内丢弃新的事件,用作防抖什么的,按一次后,多少时间内再按了也没用
Observer:观察者主要响应事件onNext()、onCompleted()和onError()onCompleted()和onError()互斥
Subscriber:实现了Observer的抽象类
onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。
Action0、Action1和ActionX:Observer的不完整版Action0只响应一个事件,对应onCompleted()Action1只响应一个事件,对应onNext()和onCompleted(),还有其他Action2、Action3等
Observable.OnSubscribe:订阅其实就是事件的抽象,事件会激发观察者,即调用观察者的响应回调
1
|
Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
|
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 主线程运行。
subscribeOn()指定订阅事件发生的线程(只生效一次,最先调用那次)observeOn()指定观察者响应的线程,可调用(生效)多次doOnSubscribe() doOnSubscribe()的后面跟一个 subscribeOn() ,就能指定准备工作的线程了。
doOnSubscribe()和Subscriber.onStart()同样是在 subscribe() 调用后而且在事件发送前执行,但区别在于它可以指定线程。
默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。
1
|
Observable.create(onSubscribe)
|
标签:
原文地址:http://www.cnblogs.com/awkflf11/p/5481087.html