[TOC]
第一个页面
1.在编写的时候遇到一个问题
A RenderFlex overflowed by 48 pixels on the right
出错的代码:
1 | child: Text( |
通过在外面包裹一成Expanded去解决这个显示错误的问题:
1 | Expanded( |
rxjava
- 观察者设计模式,操作符非常的多
- rxjava有冷热之分
- 背压只是策略, 跟线程池差不多,任务多了就处理
为什么要学rxjava:
>1.代码逻辑清晰, 优雅
>2.避免回调地狱
>3.线程调度
>利用操作符2.rxjava 我们应该学会什么东西。
观察者设计模式
线程调度架构和原理
应用
观察者模式在rxjava中的体现
观察者模式 vs 发布订阅模式(可以完全解耦)
观察者
被观察者
Flowable<T> 可以背压
Single<T> 只能发射单个数据
Completable<> 不发射数据, 只有完成和错误,没有next和onSubscribe;
MYabe 发射0或这个一个数据,要么成功,要么失败
后面三个基本是 Observable 的简化版
Observable的冷和热
冷:观察者订阅了,才会执行发射数据流的代码
Observable 和 observer是一对一的关系
Cold observable
事件类型
冷:它们各自事件是独立的
当onError和onComplete后,其他事件将不会继续
热: 无论有没有观察者,事件始终会发生,当有多个观察者进行被订阅,信息是共享的, 有点像广播模式
通过publish冷的就边热的了
1.操作符 和 观察者设计模式
2.线程切换 schedulers的原理
3.发布订阅模式
4.观察者设计模式 vs 发布订阅模式
java8 Stream
subject
AsyncSubject //热的observable,不管订阅不订阅都在发送
冷的,会从新执行一次代码,subscribe
有些情况下,需要用热的
如: Observer,被观察者:是重量级的操作,比较耗时的时候
数据库操作,dbManager,冷的,每次都用,就不合适。
热的使用场景???, RxBus是热的
热的容易内存泄漏,要记住关掉
subject,每次只会,发送最后一个数据
Subject.oncomplete()前的一个数据
BehaviorSubject:只发送订阅之前的一个数据,和后面的数据
ReplaySubject,发送,所有接受的数据,
ReplaySubject.createWitchSize(1) //就是发送前的最后一个数据和后面的数据, 相当于behavior????
PublishSubject,发送订阅之后的全部数据
subject一定要谨慎,又是观察者,又是被观察者,针对特性来进行清楚了再使用
Processor 支持背压操作,和subject就没有什么不同的了
装饰器模式, activity 用了模板方法和装饰者模式
lift原理,装饰器模式的封装是Rxjava1使用的,到Rxjava2都是基于装饰者设计模式
函数是,第一等公民
都是在subscribeActual操作的,继承 AbstractObserveableWithUpstream来进行的,Rxjava2的操作符的核心原理
沟通沟通
装饰者设计式,组合设计模式
多个数据源
自定义操作符,点击防抖,嵌套,获取缓存数据,数据合并
EV录制
Single
newThread()
线程切换用的是lift操作
因为在rxjava1中,操作失误,然后写反了,报出了MissingBackpressureException,在百度搜索的时候,说是下游处理慢于上游处理就会出现这个问题,然后就没敢用了,怕上线出现问题,后面说Rxjava2中有Flowable可以通过背压策略来进行解决,出现了这个问题,就跟线程池的的处理策略一样
界面优化
ObservableCreate.java ->ObservableSubscribeOn.java-> ObservableMap.java -> ObservableSubscribeOn -> ObservableFlatMap-> subscribeActual()
ObservableFlatMap.obj.ObservableSubscribeOn. 开启了newThread线程 source.subscribe
此时的source是ObservableMap对象的source, 然后ObservableMap.subscribe
当执行emitter.onNext()发射方法在什么线程,应该就可以决定在什么地方吗,试试???
似懂非懂
所有的对象都是操作观察者,所以注重观察者在什么线程就可以了
背压策略
自定义操作符?????
Rxjava使用场景
Rxjava + retrofit, 线程切换,方便,轮询,嵌套,出错重连
功能防抖, 多级缓存获取数据(图片获取,三级缓存) 合并数据源(来源于多个网络请求)
RxBind 和 Rxbus
1.自定义操作符????
2.subscribeOn/observerOn切换线程
3.观察者设计模式,和 发布订阅模式
4.TAG生成的快捷方式,
?参数用qurey
网络请求嵌套
功能防抖
Rxbinding ,防抖操作
throttleFirst,
点击事件间隔,用aop处理了,
flatMap多个子项,可以一个一个展示成一个子可观察者发射出来
Function
MyRxView
RxTextView
CombineLatest. //可观察数据,两个数据都发射完了,两个数据进行结合返回值给我们
debounce缓冲操作
concat
轮询操作,周期性的参数一种操作
有条件轮询, merge是两个线程是并行的吗
zip
出错重试,retry操作符
subject可以做共享, 用的是 FLowableProcessor 背压,热的
FLowableProcessor.create().toSerialized()是个线程安全的
ofType()
粘性的
界面交互爆炸系列