标签:
之前就知道有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