天天看点

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

运行结果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

  运行效果:从效果图上可以看出,合并两个的观察对象数据项应该是相等的;如果出现了数据项不等的情况,合并的数据项以最小数据队列为准。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

  运行效果:

        第一次发射得到1,作为结果与2相加;发射得到3,作为结果与3相加,以此类推,打印结果:

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

  运行效果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

take :取前n个数据

takeLast:取后n个数据

first 只发送第一个数据

last 只发送最后一个数据

skip() 跳过前n个数据发送后面的数据

skipLast() 跳过最后n个数据,发送前面的数据

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

  运行结果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)
RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

  

      使用场景:xx秒后,执行xx      

     timer 返回一个 Observable , 它在延迟一段给定的时间后发射一个简单的数字0

    timer 操作符默认在computation调度器上执行,当然也可以用 Scheduler 在定义执行的线程。

 delay 、timer 总结: 

 相同点:delay 、 timer 都是延时操作符。

 不同点:delay  延时一次,延时完成后,可以连续发射多个数据。timer延时一次,延时完成后,只发射一次数据。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

       使用场景:从网络请求数据,在数据被展示前,缓存到本地

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

Buffer( int n )      把n个数据打成一个list包,然后再次发送。

Buffer( int n , int skip)   把n个数据打成一个list包,然后跳过第skip个数据。

    使用场景:一个按钮每点击3次,弹出一个toast      

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

     例子2: 

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

         在一段时间内,只取第一个事件,然后其他事件都丢弃。

         使用场景:1、button按钮防抖操作,防连续点击   2、百度关键词联想,在一段时间内只联想一次,防止频繁请求服务器   

这段代码,是循环发送数据,每秒发送一个。throttleFirst( 3 , TimeUnit.SECONDS )   在3秒内只取第一个事件,其他的事件丢弃。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)
RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

从结果可以看出,重复的数据已经被过滤掉了

  distinctUntilChanged()  过滤连续重复的数据

 运行结果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内存优化)

从结果可以看出,连续重复的数据已经被过滤掉了

       一段时间内没有变化,就会发送一个数据。

       使用场景:百度关键词联想提示。在输入的过程中是不会从服务器拉数据的。当输入结束后,在400毫秒没有输入就会去获取数据。

                   避免了,多次请求给服务器带来的压力.

        使用场景: 可以在事件发出之前做一些初始化的工作,比如弹出进度条等等

         注意:

             1、doOnSubscribe() 默认运行在事件产生的线程里面,然而事件产生的线程一般都会运行在 io 线程里。那么这个时候做一些,更新UI的操作,是线程不安全的。

                 所以如果事件产生的线程是io线程,但是我们又要在doOnSubscribe() 更新UI , 这时候就需要线程切换。

             2、如果在 <code>doOnSubscribe()</code> 之后有 <code>subscribeOn()</code> 的话,它将执行在离它最近的 <code>subscribeOn()</code> 所指定的线程。   

             3、 subscribeOn() 事件产生的线程 ; observeOn() : 事件消费的线程

    首先看range 方法的源码

 

Range操作符发射一个范围内的有序整数序列,你可以指定范围的起始和长度。

RxJava将这个操作符实现为<code>range</code>函数,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)。

<code>range</code>默认不在任何特定的调度器上执行。有一个变体可以通过可选参数指定Scheduler。

例子

  结果

/rx_range: 10 /rx_range: 11 /rx_range: 12
/rx_defer: 12 /rx_just: 11

可以看到,just操作符是在创建Observable就进行了赋值操作,而defer是在订阅者订阅时才创建Observable,此时才进行真正的赋值操作。

<code>Defer</code>操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。

在某些情况下,等待直到最后一分钟(就是知道订阅发生时)才生成Observable可以确保Observable包含最新的数据。

下一篇: 跨域