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分析)
- Android函数响应式编程——RxJava的4大subject和线程控制
- Android函数响应式编程最新RxJava-线程控制
- Android--Rxjava分析—Subject
- 响应式函数式编程和RxJava的理解
- Rxjava分析—Subject
- Rxjava分析—Subject
- Rxjava分析—Subject
- RxJava—Subject系列
- Android函数响应式编程——必学的RxJava条件操作符和布尔操作符all、contains、isEmpty、amb、defaultIfEmpty
- Android函数响应式编程——RxJava不完整定义回调,更灵动的观察者写法
- Android函数响应式编程——必学的RxJava创建操作符create、just、from、interval、range、repeat
- Android函数响应式编程——必学的RxJava组合操作符startWith、merge、concat、zip、combineLastest
- Android函数响应式编程——必学的RxJava辅助操作符delay、Do、subscribeOn、observeOn、timeout
- Android函数响应式编程——必学的RxJava错误处理操作符catch、retry
- Android函数响应式编程——必学的RxJava转换操作符toList、toSortedList、toMap
- RxJava响应式函数编程
- RxJava响应式函数编程
- Android函数响应式编程——RxJava最快速度入门
- OkHttpUtil
- LightOJ
- Java常用关键字
- java Myeclipse Debug下的Expressions窗口
- 【JavaWeb】Log4j2的使用(一)
- Android函数响应式编程——RxJava的4大subject和线程控制
- 1002: 简单多项式求值
- docker实战一之Centos安装docker
- bzoj 4988: 塔 哈希
- 将图片上传到FTP服务器
- git从码云下载ibase4j代码
- A15_特性
- 汽车打不着火,老司机竟然能这样推着!
- test title