RxJava—学习笔记

在这里插入图片描述
快速学习与上手,建议是进行归纳分类,学习后实践,过半个月再来检索一下,对自己不太熟悉的模块再次深入学习,反复如此,直到深入掌握各个模块,大功告成。
归纳分类后,我感觉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>() {
    
    
                    @Override
                    public 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>() {
    
    
                    @Override
                    public 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>() {
    
    
                    @Override
                    public 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>() {
    
    
                    @Override
                    public String apply(final String s) throws Exception {
    
    
                        return s + "LONG";
                    }
                })
                .map(new Function<String, String>() {
    
    
                    @Override
                    public String apply(final String s) throws Exception {
    
    
                        return s + "Qiu";
                    }
                })
                .subscribe(new Consumer<String>() {
    
    
                    @Override
                    public 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>>() {
    
    
                    @Override
                    public ObservableSource<String> apply(final Data data) throws Exception {
    
    
                        return Observable.fromIterable(data.strs);
                    }
                }).subscribe(new Consumer<String>() {
    
    
            @Override
            public 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>() {
    
    
                    @Override
                    public boolean test(final String s) throws Exception {
    
    
                        return s.contains("冰雪");
                    }
                }).subscribe(new Consumer<String>() {
    
    
            @Override
            public 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>() {
    
    
                    @Override
                    public 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>() {
    
    
                    @Override
                    public boolean test(final String string) throws Exception {
    
    
                        System.out.println("all test:" + string);
                        return string.contains("冰雪");
                    }
                }).subscribe(new Consumer<Boolean>() {
    
    
            @Override
            public 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>() {
    
    
                    @Override
                    public void accept(final Boolean aBoolean) throws Exception {
    
    
                        System.out.println("accept Boolean:" + aBoolean);
                    }
                });

推荐资料

RxBinding

okhttp-RxHttp

《RxJava 2.x 实战》,《RxJava响应式编程》

猜你喜欢

转载自blog.csdn.net/qw85525006/article/details/105889595