RxAndroid的部分笔记

来源:互联网 发布:淘宝手机端钻展 编辑:程序博客网 时间:2024/04/29 20:32

1、Observable的大部分操作,都会返回一个新的Observable。

所以像下面这种写法是不行的:

A a = new A();a.func1();a.func2();a.func3();
如果非要这种写法,就需要这样写:
A a = new A();a = a.func1();a = a.func2();a = a.func3();
当然,还是按照大部分例子中连贯的写法比较好。


2、Observable只有在调用subscribe()方法后才执行操作。


3、

  • 对于 create() , just() , from()   等                 --- 事件产生   

               map() , flapMap() , scan() , filter()  等    --  事件加工

              subscribe()                                          --  事件消费

  •   事件产生:默认运行在当前线程,可以由 subscribeOn()  自定义线程

         事件加工:默认跟事件产生的线程保持一致, 可以由 observeOn() 自定义线程

       事件消费:默认运行在当前线程,可以有observeOn() 自定义



4、RxJava为我们内置了几种线程模型,主要区别如下:
  computation : 内部是一个线程,线程池的大小cpu核数:Runtime.getRuntime().availableProcessors(),这种线程比较适合做纯cpu运算,如求100亿以内的斐波那契数列的和之类。
  newThread : 每次createWorker都会生成一个新的线程。
  io : 与newThread类似,但内部是一个没有上线的线程池,一般来讲,使用io会比newThread好一些,因为其内部的线程池可以重用线程。
  immediate在当前线程立即执行
  trampoline : 在当前线程执行,与immediate不同的是,它并不会立即执行,而是将其存入队列,等待当前Scheduler中其它任务执行完毕后执行,这个在我们时常使用的并不多,它主要服务于repeat ,retry这类特殊的变换操作。
  from : 接收一个Executor,允许我们自定义Scheduler。


5、只所以说Single是用于发射单一值的,是因为Observable的大部分方法都包含多个参数值(比如just()方法就可以传多个值),同时Single省略了Observable中的部分方法,理论上在传送单一变量时使用single是最方便的。


6、subject的使用可以参见这一篇文章 --> (RxJava 常见误区(一):过度使用 Subject):http://blog.csdn.net/PrototypeZ/article/details/51113828


7、一个just()的坑:

错误代码

Observable         .just(initValues())          .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())         .subscribe(values -> doSomething());

我的需求是调用initValues()方法从数据库加载一些数据,在io线程执行,然后在mainThread订阅结果,但是这样写并不能实现我的需求。

原因

因为just()from()这类能够创建Observable的操作符在创建之初,就已经存储了对象的值,而不是在被订阅的时候才创建。所以在我们订阅之前,initValues()方法就已经在开始执行了,这样就不能达到我们想要的效果。

解决方法

用create()操作符。

Observable       .create(subscriber ->                XXObject values = initValues();                subscriber.onNext(values);        )        .subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(values -> doSomething());

8、map()和flatMap()之间的不同在于,map可以对发射的值做处理,而flatMap对发射的值做处理的同时返回一个Observable,这个返回的Observable会继续按照之前给定的subscribe()继续实行。之所以特地分开这两种方法,是为了比如使用retrofit之类的也会生成Observable的方法提供一个处理的接入口,所以一般map()进行比较简单的处理即可。


9、关于Transformers和compose() -->(不要打破链式:使用Rxjava的compose()操作符):http://www.tuicool.com/articles/YrmiQj6


10、(给 Android 开发者的 RxJava 详解):http://gank.io/post/560e15be2dca930e00da1083


11、merge()和mergeDelayError():merge()可以合并多个Observable同时运行,并在同一个subscribe()中输出,输出顺序按照Observable的响应顺序。适用场景是当应用页面存在缓存,可以同时读取缓存和网络请求,由于网络请求较慢,所以页面可以做到先显示缓存,待网络请求成功后,显示网络请求。

但是merge()中,如果其中一个Observable出问题,会中断所有Observable操作跳到onError,这时候使用mergeDelayError(),可以使得Observable出问题时,不阻碍其他Observable运行,并且其他Observable可以继续运行到onNext中,最终所有操作完成时才响应onError。

注意:先mergeDelayError再指定线程的话,mergeDelayError没有起到延迟通知onError的作用。所以要设定线程需要各自的Observable单独设置。


12、zip():名义上是将两个Observable打包一起运行,和merge()不同的是:一、经过zip()的两个Observable会同时运行,并且等两个Observable都运行完毕后才进入下一步;二、可以是发射不同值的两个Observable结合到一起,并通过zip()中传入的Func()方法,处理两者的返回结果,并最终将处理结果返回,该结果甚至可以是传入的值以外的类型。

所以综上所述,zip后的subscribe()应该用来处理Func()中的返回值。zip()方法可以在需要同时调用多个网络接口,获取到数据后再组合处理显示用。

注意:任意一个Observable出问题时,都直接跳到onError,所有Observable停止运行。


13、concat():与merge()大致相同,不同的是:merge()是不按顺序的,而concat()是按照给入参数的顺序执行的。比如concat(o1,o2,o3),那么运行的时候只会按照o1->o2->o3的顺序执行下去。这里可以用线程来理解:merge()可以理解为对每一个Observable开独立线程执行,所以各自线程运行到结束时的顺序不确定;zip()也是各自开线程独立运行,但是线程之间做了线程同步(加入了Thread.join()),所以线程之间都等到对方结束时才进行到下一步;concat()则是单线程了,按照给入参数的顺序入队,先入先出。

注意:任意一个Observable出问题时,都直接跳到onError,所有Observable停止运行。

0 0
原创粉丝点击