Android函数响应式编程——RxJava的4大subject和线程控制

来源:互联网 发布:node api 框架 编辑:程序博客网 时间:2024/06/05 09:41

Subject

Subject既可以是一个Observer也可以是一个Observable,它用来连接两者。所以Subject被认为是Subject=Observable+Observer

1.PublishSubject

PublishSubject在被创建完成之后立刻开始发射数据,所有有一个风险:在所有的订阅者订阅之前,数据可能已经发送了 。

解决方法:1.确保所有订阅者的订阅比这个PublishSubject早2.使用ReplaySubject

2.BehaviorSubject

当观察者订阅BehaviorSubject的时候,BehaviorSubject就开始发射原始Observable最近发射的数据。如果这个时候还没有收到任何数据,BehaviorSubject就会发射一个默认值。然后继续发射其他任何来自原始Observer的数据。如果原始的Observer因为发生了一个错误而终止,BehaviorSubject将不会发射人恶化数据,但是会向Observable传递一个异常通知的。

3.ReplaySubject

不管观察者什么时候订阅它,它都会把所有数据给观察者。

限定他的范围:设定Buffer的具体大小;设定具体的时间范围。

注意:如果使用了ReplaySubject作为了观察者,注意不要在多个线程中调用onNext、onCompleted和onError方法。这可能会导致顺序错乱,并且违反了Observer规则。

4.AsyncSubject

当被观察者完成时,AsyncSubject只会发射来自原始Observer的最后一个数据。如果原始的Observer因为发生了错误而终止,AsyncSubject将不会发射任何数据,但是会向Observable传递一个异常通知。


RxJava的线程控制

1.内置的Scheduler

如果我们不指定线程,默认是在调用subscribe方法的线程上进行回调的。如果我们想切换线程,就需要使用Scheduler。RxJava已经内置了如下5个Scheduler。

1.Schedulers.immediate():直接在当前线程运行。它是timeout、、timeInterval和timestamp操作符的默认调度器。

2.Schedulers.newThread():总是启用新线程,并在新线程执行操作

3.Schedulers.io():i/o操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread差不多,区别在于io()的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。

4.Schedulers.computation():计算所使用的Scheduler,例如图形的计算。这个Scheduler使用固定线程池,大小为CPU核数。不要把i/o操作放在computation()中,否则i/o操作的等待时间会浪费cpu。它是buffer、debounce、delay、interval、sample和skip操作符的默认调度器。

5.Schedulers.trampoline():当我们想在当前线程执行一个任务时,并不是立即时,可以用.trampoline将它入队。这个调度器将会处理它的队列并且按序运行队列中的每一个任务。它是repeat和retry的操作符默认的调度器。

6.RxAndroid中常用的Scheduler:AndroidSchedulers.mainThread(),主线程。


控制线程:采用subscribeOn和observeOn。


(rxjava的应用和源码文章先搁置一下,先看了网络请求框架的源码再来结合rxjava分析)

阅读全文
0 0
原创粉丝点击