Rxjava

Rxjava使用

操作符查询图
image.png

概述

Rxjava中最重要的其实是Rx思想,所谓的Rx思想,也就是响应式编程思想(下一步随上一步的变化而变化,点菜->下单->做菜)。它很好的将链式编程风格和异步结合在一起。(又称他为 卡片式编程

卡片式编程(链式编程)

image.png

上层observeable,可以添加很多map(等卡片),而后面的(入参)数据格式随前一个(返回值)而变化。(每次添加的map返回仍是this–Observable,所以可以一直“.” 这样链式调用)
通过订阅,将上层Observable和下层Observe关联起来。
image.png

image.png

使用

image.png

RxJava + Retrofit 完成网络请求

image.png
image.png
image.png

View防抖

View防抖:1秒内点击多次,只响应一次。
RxBinding提供了防抖功能。

image.png

doOnNext()

当需要插入一个方法,但是不对Observe产生影响的时候,可以用doOnNext,(map的返回值是会影响下层的)。

image.png
image.png

Rxjava的设计模式

标准观察者设计模式

微信公众号就是典型的观察者设计模式。公众号=被观察者,用户=观察者,关注公众号=订阅。所以公众号一推送消息,所有观察者都能收到消息。
观察者设计模式就是:多个观察者去订阅一个被观察者,当被观察者发生改变的时候,所有观察者都能收到通知。

image.png

具体实现:

被观察者抽象(公众号)
image.png
被观察者实现(公众号)
image.png

观察者抽象(用户)
image.png
观察者实现(用户)
image.png

测试类
image.png

RxJava观察者设计模式

RxJava的观察者设计模式,其实叫发布订阅模式更为合理。

普通观察者设计模式:被观察者(一对多)观察者。RxJava的:被观察者(多对一)观察者

普通观察者设计模式:被观察者内部有一个容器(存放观察者的列表),然后去遍历列表给观察者发送消息。RxJava的:被观察者内部没有列表,被观察者和观察者中间多了一个中间层(发射器),被观察者给发射器发消息,发射器再给观察者发消息,这样使得两者解耦了
image.png

源码解析

image.png

1.自定义观察者
观察者接口里就四个方法:onSubscribe()—执行所有代码前先调用这个方法,如可以弹加载窗。 还有onComplete完成等等。
image.png

2.新建观察者

image.png

image.png

3.订阅

image.png

image.png

subscribeActual()这个方法调用哪个具体得看上层是啥,这个例子里是ObservableCreat的

image.png

aaaa.png

调用发射器的onNext()方法
image.png
image.png

由上面代码可以看出Rxjava的设计模式,其实是将自定义观察者和自定义被观察者(source)通过订阅关联起来,而在上层被观察者那,会进行包装,被观察者调用下层的onNext,下层在调用下层的onNext直到Observer的onNext

RxJava简单订阅过程.png

Hook

Hook机制:钩子、拦截器、监听。在RxJava执行前会有一个全局的拦截器,能拦截各种东西,如能知道所有的map(数量),create等。

image.png

image.png

image.png

所以全局的自定义hook,就是调用这个方法
image.png

map

image.png

image.png
image.png
image.png

加入map以后,就变成了拆包封包的过程了。当调用 ObservableMap.subscribe(终点)订阅方法的时候, 会调用subscribeActual(observer) observer就是终点。
订阅一开始,会将终点传入ObservableMap(终点),然后整个ObservableMap(终点)打包成一个包裹,传入上层。上层 map 再将 下层 打包ObservableMap(ObservableMap(终点)),这样一直打包到顶层。也就是所谓的洋葱模型。

调用关系,从订阅开始就把终点开始一层一层向上打包,然后调用onNext的时候,一层一层向下拆包
image.png

封包拆包
3.jpg

装饰模型

链式调用,create返回Observable,下层map返回Observable这样一层一层的装饰叫做装饰模型。
装饰模型.png

总结

Rxjava的设计模式,先通过装饰模型,从上到下的链式调用装饰,然后从订阅的那个触发点,从终点开始 一层一层的封包,调用OnNext的时候又一层一层的拆包向下调用。
终极三部曲.png

线程切换

线程切换就两,subscribeOn订阅者运行在哪,observeOn观察者运行在哪
image.png

Schedulers.io()

Schedulers.io()用于io()时间长的,Schedulers.computation()用于计算频繁的

image.png
直接看下面
image.png
直接看下面
image.png
直接看下面
image.png
Schedulers.io()所以这个方法就是声明了一个核心线程1的线程池
image.png

.subscribeOn()给上面的分配XXX线程

image.png

image.png

image.png

所以不写observeOn的话,会把所有的代码都放入 io() 线程执行,因为把上层source.subscribe(parent),包上终点一起扔在new Runnable里了
image.png

AndroidSchedulers.mainThread()

跟Schedulers.io()一样 定义的 static final Scheduler。

new Handler(Looper.getMainLooper())其实就是用的Handler,这是标准写法,传入主线程的Looper,获取主线程的Handler
image.png
通过主线程的Handler给主线程发送消息
image.png

.observeOn()给下面的分配XXX线程

image.png
直接看下面
image.png
new ObserveOnObserver
image.png

image.png
也就是终点4个方法 onNext等会通过Handle.sendMessage 发送消息给主线程,从而执行在主线程上
image.png

observeOn.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享