快速学习与上手,建议是进行归纳分类,学习后实践,过半个月再来检索一下,对自己不太熟悉的模块再次深入学习,反复如此,直到深入掌握各个模块,大功告成。
归纳分类后,我感觉1周或者几天,就应该能掌握吧… …
然后 每周再 回想/检索 或 实战中 自己哪里没有掌握,再学习(可以查资料,看视频,深入)…反复如此,这叫做 后刻意练习 学习方法…
Observable ( 被观察者 ) / Observer ( 观察者 )
Flowable (被观察者)/ Subscriber (观察者)
Observable: 被观察者
Observer: 观察者
Subscribe: 订阅
Disposable: 断连。在类出现的函数中加入d.dispose()这一段代码,就能够让连接断开。
Transformer:转换器,将 Observable/Flowable/Single/Completable/Maybe 对象 转换成另一个 Observable/Flowable/Single/Completable/Maybe 对象
compose:
Observable 被观察者(顾客) -> Subscribe 订阅者(服务员) -> Observer 观察者(厨师)
线程操作
调度器(Scheduler)
线程切换函数 | 概述 |
---|---|
Schedulers.single | 1个线程池,重复利用 |
Schedulers.immediate() | 当前线程 = 不指定线程 |
AndroidSchedulers.mainThread() | Android主线程, 操作UI |
Schedulers.newThread() | 常规新线程 , 耗时等操作 |
Schedulers.io() | io操作线程 , 网络请求、读写文件等io密集型操作 |
Schedulers.computation() | CPU计算操作线程 , 大量计算操作,固定的线程池,大小为CPU核数,CPU密集型计算 |
Schedulers.from 转换一个调度实例
subscribeOn:多次执行,只有一次会生效
observeOn:多次执行,线程可以一直切换
如果想多次切换,这么办?弄一个DEMO举一反三:
Observable.just("冰雪").observeOn(Schedulers.newThread()).map(new Function<String, String>() {
@Overridepublic String apply(final String s) throws Exception {
System.out.println("test-1:" + Thread.currentThread().getName() + " s:" + s);return s + "情";}}).observeOn(Schedulers.io()).map(new Function<String, String>() {
@Overridepublic String apply(final String s) throws Exception {
System.out.println("test-2:" + Thread.currentThread().getName() + " s:" + s);return s + "缘long";}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {
@Overridepublic void accept(final String s) throws Exception {
System.out.println("test-3:" + Thread.currentThread().getName() + " s:" + s);}});
输出结果:
test-1:RxNewThreadScheduler-1 s:冰雪
test-2:RxCachedThreadScheduler-1 s:冰雪情
test-3:main s:冰雪情缘long
背压
背压(被观察者发送事件速度快于观察者处理的速度,导致下游buffer溢出)只有异步的场景下使用,被观察者与观察者处于不同线程中。
Flowable: 也就是背压的实现类
Subscriber: 订阅,和Observer差不多,但是多了一些适配Flowable的功能
BackpressureStrategy: 着重讲解。
BackpressureStrategy背压策略
策略名称 | 概述 |
---|---|
MISSING | 提示缓存区已满 |
ERROR | 默认模式,数据超出缓存的128时,抛出异常 |
BUFFER | 无限缓存,可能会OOM |
DROP | 超出128时进行丢弃后面进来的数据 |
LATEST | 超出128时进行丢弃最开始进来的数据 |
操作符
创建操作符:https://www.jianshu.com/p/e19f8ed863b1
变换操作符
Observable发射的相关东西变化为新的Observables的东西.
map(),flatMap(),concatMap
变换操作符:https://www.jianshu.com/p/904c14d253ba
// map()
Observable.just("HAI").map(new Function<String, String>() {
@Overridepublic String apply(final String s) throws Exception {
return s + "LONG";}}).map(new Function<String, String>() {
@Overridepublic String apply(final String s) throws Exception {
return s + "Qiu";}}).subscribe(new Consumer<String>() {
@Overridepublic void accept(final String s) throws Exception {
System.out.println(s);}});
输出结果:HAILONGQiu
// flatMap
Data data = new Data();data.strs.add("天府新区");data.strs.add("高新区");data.strs.add("武侯区");Observable.just(data).flatMap(new Function<Data, ObservableSource<String>>() {
@Overridepublic ObservableSource<String> apply(final Data data) throws Exception {
return Observable.fromIterable(data.strs);}}).subscribe(new Consumer<String>() {
@Overridepublic void accept(final String s) throws Exception {
System.out.println(s);}});
输出结果:
天府新区
高新区
武侯区
过滤操作符
过滤操作符:https://www.jianshu.com/p/c3a930a03855
Observable.just("冰雪情缘", "Android TV", "冰雪情缘long", "Android Studio", "冰雪情缘TV", "冰雪奇缘").filter(new Predicate<String>() {
@Overridepublic boolean test(final String s) throws Exception {
return s.contains("冰雪");}}).subscribe(new Consumer<String>() {
@Overridepublic void accept(final String s) throws Exception {
System.out.println(s);}});
输出的结果:
冰雪情缘
冰雪情缘long
冰雪情缘TV
冰雪奇缘
组合/合并操作符
https://www.jianshu.com/p/c2a7c03da16d
Observable<String> oneObservable = Observable.just("hai", "long", "qiu");Observable<String> twoeObservable = Observable.just("冰", "雪", "情", "缘");Observable.merge(oneObservable, twoeObservable).subscribe(new Consumer<String>() {
@Overridepublic void accept(final String s) throws Exception {
System.out.println("accept s:" + s);}});
输出结果:
accept s:hai
accept s:long
accept s:qiu
accept s:冰
accept s:雪
accept s:情
accept s:缘
功能操作符
https://www.jianshu.com/p/b0c3669affdb
条件/布尔操作符
条件/布尔操作符:https://www.jianshu.com/p/954426f90325
// all,所有字符串不满足函数的条件(是否包含"冰雪")
Observable.just("冰雪情缘", "Android TV", "Android Studio", "冰雪情缘TV").all(new Predicate<String>() {
@Overridepublic boolean test(final String string) throws Exception {
System.out.println("all test:" + string);return string.contains("冰雪");}}).subscribe(new Consumer<Boolean>() {
@Overridepublic void accept(final Boolean aBoolean) throws Exception {
System.out.println("accept Boolean:" + aBoolean);}});
输出结果:
all test:冰雪情缘
all test:Android TV
accept Boolean:false
上面的代码,也可以使用 contains
条件操作符
Observable.just("冰雪情缘", "Android TV", "Android Studio", "冰雪情缘TV").contains("冰雪").subscribe(new Consumer<Boolean>() {
@Overridepublic void accept(final Boolean aBoolean) throws Exception {
System.out.println("accept Boolean:" + aBoolean);}});
推荐资料
RxBinding
okhttp-RxHttp
《RxJava 2.x 实战》,《RxJava响应式编程》