Rxjava使用
操作符查询图
概述
Rxjava中最重要的其实是Rx思想,所谓的Rx思想,也就是响应式编程思想(下一步随上一步的变化而变化,点菜->下单->做菜)。它很好的将链式编程风格和异步结合在一起。(又称他为 卡片式编程 )
卡片式编程(链式编程)
上层observeable,可以添加很多map(等卡片),而后面的(入参)数据格式随前一个(返回值)而变化。(每次添加的map返回仍是this–Observable,所以可以一直“.” 这样链式调用)
通过订阅,将上层Observable和下层Observe关联起来。
使用
RxJava + Retrofit 完成网络请求
View防抖
View防抖:1秒内点击多次,只响应一次。
RxBinding提供了防抖功能。
doOnNext()
当需要插入一个方法,但是不对Observe产生影响的时候,可以用doOnNext,(map的返回值是会影响下层的)。
Rxjava的设计模式
标准观察者设计模式
微信公众号就是典型的观察者设计模式。公众号=被观察者,用户=观察者,关注公众号=订阅。所以公众号一推送消息,所有观察者都能收到消息。
观察者设计模式就是:多个观察者去订阅一个被观察者,当被观察者发生改变的时候,所有观察者都能收到通知。
具体实现:
被观察者抽象(公众号)
被观察者实现(公众号)
观察者抽象(用户)
观察者实现(用户)
测试类
RxJava观察者设计模式
RxJava的观察者设计模式,其实叫发布订阅模式更为合理。
普通观察者设计模式:被观察者(一对多)观察者。RxJava的:被观察者(多对一)观察者。
普通观察者设计模式:被观察者内部有一个容器(存放观察者的列表),然后去遍历列表给观察者发送消息。RxJava的:被观察者内部没有列表,被观察者和观察者中间多了一个中间层(发射器),被观察者给发射器发消息,发射器再给观察者发消息,这样使得两者解耦了。
源码解析
1.自定义观察者
观察者接口里就四个方法:onSubscribe()—执行所有代码前先调用这个方法,如可以弹加载窗。 还有onComplete完成等等。
2.新建观察者
3.订阅
subscribeActual()这个方法调用哪个具体得看上层是啥,这个例子里是ObservableCreat的
调用发射器的onNext()方法
由上面代码可以看出Rxjava的设计模式,其实是将自定义观察者和自定义被观察者(source)通过订阅关联起来,而在上层被观察者那,会进行包装,被观察者调用下层的onNext,下层在调用下层的onNext直到Observer的onNext
Hook
Hook机制:钩子、拦截器、监听。在RxJava执行前会有一个全局的拦截器,能拦截各种东西,如能知道所有的map(数量),create等。
所以全局的自定义hook,就是调用这个方法
map
加入map以后,就变成了拆包封包的过程了。当调用 ObservableMap.subscribe(终点)订阅方法的时候, 会调用subscribeActual(observer) observer就是终点。
订阅一开始,会将终点传入ObservableMap(终点),然后整个ObservableMap(终点)打包成一个包裹,传入上层。上层 map 再将 下层 打包ObservableMap(ObservableMap(终点)),这样一直打包到顶层。也就是所谓的洋葱模型。
调用关系,从订阅开始就把终点开始一层一层向上打包,然后调用onNext的时候,一层一层向下拆包
封包拆包
装饰模型
链式调用,create返回Observable,下层map返回Observable这样一层一层的装饰叫做装饰模型。
总结
Rxjava的设计模式,先通过装饰模型,从上到下的链式调用装饰,然后从订阅的那个触发点,从终点开始 一层一层的封包,调用OnNext的时候又一层一层的拆包向下调用。
线程切换
线程切换就两,subscribeOn订阅者运行在哪,observeOn观察者运行在哪
Schedulers.io()
Schedulers.io()用于io()时间长的,Schedulers.computation()用于计算频繁的
直接看下面
直接看下面
直接看下面
Schedulers.io()所以这个方法就是声明了一个核心线程1的线程池
.subscribeOn()给上面的分配XXX线程
所以不写observeOn的话,会把所有的代码都放入 io() 线程执行,因为把上层source.subscribe(parent),包上终点一起扔在new Runnable里了
AndroidSchedulers.mainThread()
跟Schedulers.io()一样 定义的 static final Scheduler。
new Handler(Looper.getMainLooper())其实就是用的Handler,这是标准写法,传入主线程的Looper,获取主线程的Handler
通过主线程的Handler给主线程发送消息
.observeOn()给下面的分配XXX线程
直接看下面
new ObserveOnObserver
也就是终点4个方法 onNext等会通过Handle.sendMessage 发送消息给主线程,从而执行在主线程上