RxJava2.0的使用-2
五、指定工作线程
- subscribeOn:指定observable发送事件的线程。
- observeOn:指定Observer接收事件的线程。
注意:多次指定Observable的线程只有第一次指定的有效,也就是说多次调用subscribeOn()方法只有第一次的有效,其余的会被忽略。多次指定Observer的线程,每调用一次observeOn(),Observer的线程就会切换一次。
线程的选项:
- Schedulers.newThread(): 代表一个常规的新线程。
- Schedulers.io(): 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作。如异步阻塞IO操作,这个调度器的线程池会根据需要增长。Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器。
- Schedulers.computation(): 代表CPU计算密集型的操作,例如需要大量计算的操作。默认线程数等于处理器的数量。
- Schedulers.from(executor):使用指定的Executor作为调度器。
- Schedulers.trampoline( ):以FIFO方式执行在当前线程排队的任务。
- Schedulers.single():返回一个默认的、共享的、单线程支持的实例,用于在同一背景线程上执行强顺序执行的工作。
- AndroidSchedulers.mainThread(): 代表Android的主线程。
备注:在RxJava内部使用线程池来维护这些线程,所以效率比较高。
六、操作符 map
map操作符作用:返回一个Observable(将上个Observable的发射的每个Emitter都经过指定函数变化),并将变化后的事件发射。
用途:数据的处理(截取数据)、数据类型转换(由图片path转为Bitmap)等。
注意:经map操作符作用,发射事件的个数不会改。即原始Observable发射3个事件,Observer会接收到3个事件。
例子描述:原始Observable发射”1”、”2”,map中的Function函数指定每个数据追加”map”,并将结果发射出去。
备注:map操作符可以多次使用,即原始Observable的数据可以经过多次变换。
七、操作符 flatMap
flatMap操作符作用:返回一个Observable(将上个Observable的发射的每个Emitter都经过指定函数变化,这个函数可以将每个原始Emitter变化为ObservableSource,并将所有的ObservableSource合并后放进一个单独的Observable里返回),并将合并后的事件发射。
用途:数据处理(拿到List < T >中T的各种信息)、多个有关联的网络请求连续调用(例如注册成功后直接调用登陆接口)等。
注意:flatMap并不保证事件的顺序。
例子描述:原始Observable发射”1”、”2”、”3”,flatMap中的Function函数指定每个数据前追加”flatMap”且发射2次,将合并的事件发射出去。为了便于观察顺序问题,设置1秒的延时。
由Log可以看出,使用flatMap操作符合并的发射事件顺序并不能保证跟原始Observable的发射事件顺序保持一致。使用flatMap操作符时,使用delay()方法设置的延时是指每个经Function函数处理后的Emitter产生的新ObservableSource的延时时间,这个延时时间会在同一时间作用于所有ObservableSource。如果设置为固定值,那么所有的新ObservableSource会在同一时间发射;如果设置为随机数,不同ObservableSource会在各自随机数延时时间后发射事件。例如:设置一个3秒内的随机数。
八、操作符 concatMap
concatMap操作符作用:与flatMap操作符类似,唯一不同的是concatMap操作符将严格按照原始Observable的发射事件顺序来发射合并后的事件。
例子描述:与flatMap操作符例子一样,只将操作符改为concatMap操作符,延时时间设置为固定值。
由Log可以看出,使用concatMap操作符时,使用delay()方法设置的延时是指每个经Function函数处理后的Emitter产生的新ObservableSource的延时时间,这个延时时间会在上一个ObservableSource发出后再作用于下一个ObservableSource。事件发射顺序与原始Observable的事件发射顺序保持一致。
九、操作符 zip
zip操作符的作用:将多个原始Observable发射的事件经过Function函数处理整合成一个ObservableSource,并严格按照顺序发射。整合后的事件数 == 事件数最少的原始Observable的事件数。每达到整合条件,就发射一个整合后的事件。
例子描述:observable1发射”1”、”2”、”3”、”4”、”onComplete()”;observable2发射”A”、”B”、”C”、”onComplete()”;定义Function函数的功能为 s1 + s2;为了观察顺序,添加延时 。
因为没有指定observable1、observable2的工作线程,所以默认它们工作在同一线程。由Log可以看出,因为它们工作在同一线程,observable1发射完事件后observable2发射事件,BiFunction函数整合了observable1与observable2发射的数据,mObserver接收的事件数量与observable2事件数量相等,即整合后的事件数与事件数最少的Observable的事件数相等。
例子描述:指定observable1、observable2工作在不同的子线程。
由Log可以看出,zip操作符接收原始Observable数据,没达到整合条件,就发射一个整合后的事件。
备注:zip操作符一次最多支持9个Observable。
十、操作符 buffer
buffer操作符作用:指定一个缓存大小,每当存满指定大小的缓存后,将当前缓存区的数据以List < T > 的形式发送出去;当原始Observable完成或发生错误时,发送当前缓存区的数据,并传播原始Observable的这个notification(完成或发生错误)。
例子描述:observable1发射”1”、”2”、”3”、”onComplete()”、”4”;设置缓存区大小为2。
十一、操作符 take
take操作符的作用:发射原始Observable前指定个数的数据。如果原始Observable的数据个数小于指定个数,那么发送整个原始Observable。
例子描述:observable1发射”1”、”2”、”3”、”onComplete()”、”4”;设置缓存区大小为2。
例子描述:observable1发射”1”、”2”、”3”、”onComplete()”、”4”;设置缓存区大小为5。
十二、操作符 distinct
distinct操作符作用:去除重复数据。
十三、操作符 filter
filter操作符作用:过滤指定条件的数据
例子描述:过滤小于等于3的数据。
十四、操作符 sample
sample操作符的作用:每隔指定的时间就从Observable中取出一个事件发送给Observer。
例子描述:Observable循环发送事件,这是sample时间间隔为1秒。