flutter

[TOC]

第一个页面

1.在编写的时候遇到一个问题

A RenderFlex overflowed by 48 pixels on the right

出错的代码:

1
2
3
4
child: Text(
articles['title'],
style: TextStyle(fontSize: 15, color: Colors.black),
),

通过在外面包裹一成Expanded去解决这个显示错误的问题:

1
2
3
4
5
6
Expanded(
child: Text(
articles['title'],
style: TextStyle(fontSize: 15, color: Colors.black),
),
),

rxjava

  1. 观察者设计模式,操作符非常的多
  2. rxjava有冷热之分
  3. 背压只是策略, 跟线程池差不多,任务多了就处理

为什么要学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()
粘性的

界面交互爆炸系列