RxJava架构设计

RxJava使用系列

RxJava概念与观察者设计模式

    1.起点 和 终点,一旦满足 起点 和 终点 这样的需求,都可以使用RxJava来实现。

    2.标准中的观察者设计模式,一个被观察者 ---- 多个观察者 多次注册。

    3.RxJava是改装的观察者设计模式,一个订阅(注册) 一个观察者。

RxJava上游和下游

    1.上游 Observable 被观察者, 下游 Observer 观察者。

    2.ObservableEmitter<Integer> emitter 发射器 发射事件。

    3.拆分来写的,链式调用。

RxJava创建型操作符

    create:使用者自己发射事件

    just 内部自己发射的,单一对象

    fromArray 内部自己发射的,数集对象

    empty:内部自己发射的 ,下游默认是Object,无法发出有值事件,只会发射 onComplete

    range:内部自己发射的,start 1 累加  count 5    最后结果:1 2 3 4 5

RxJava变换型操作符

上游 -------> 变换操作(往右边流向的时候,进行变换) ----------> 下游

    map 

    flatMap

    concatMap

    groupBy

    buffer

RxJava过滤性型操作符

    filter

    take 定时器 

    distinct 过滤重复的元素

    elementAT   指定下标输出

RxJava条件性型操作符

    all 如同if 全部为true 才是true,只要有一个false,就是false

    contains 包含

    any 同all相反,全部为false才是false,有一个为true就是true

RxJava合并性型操作符

    startWith 两个给被观察者合并,先执行后边的被观察者

    concatWith 两个给被观察者合并,和startWith相反 

    concat 多个合并成一个 最多四个 按照顺序执行

    merge 多个合并成一个 最多四个 并列执行,并发

    zip 需要对应关系,对应执行,如果不对应会被忽略,最多九个被观察者

RxJava异常处理操作符

onErrorReturn 能够接受e.onError 接受异常后,中断接受上游的后续发射的事情 作用 处理记录异常 通知给下一层

onErrorResumeNext  能够接受e.onError 接受异常后,也可以返回异常标识,返回被观察者,被观察者可以再次发射事件给下游

onExceptionResumeNext   能在发生异常的时候(throw Exception)保持程序的健壮,(这种异常一定是可以接受的,才能使用)

retry 重试

RxJava线程切换

异步线程区域 上游

Schedulers.io() 代表io流操作 网络操作 耗时操作

Schedulers.Thread() 比较常规的,普普通通

Schedulers.Comptation()  代表CPU大量计算所需要的线程

给上游分配多次,只会在第一次切换,后面就不切换了(忽略)

下游

AndroidSchedulers.mainThread()  专门为Android main线程量身定做 

给下游切换,每次都会去切换

如果不配置异步线程,上游发一次,下游接受一次

如果配置异步线程,就是异步的表现

传统的写法四分五裂,RxJava基于事件流编程,一条线索下来

RxJava背压模式

Flowable 背压模式 什么情况下使用     如果没有背压模式,上游不停发射线索,下游处理不过来,就会造成内存泄漏

策略

1.Error 上游不停发射消息,下游阻塞,放入缓存池,如果池子满了,抛出异常

2.Buffer 上游不停发射消息,下游阻塞,放入缓存池,如果池子满了,等待下游来处理

3.Drop 上游不停发射消息,下游阻塞,放入缓存池,如果池子满了,把后面的丢弃

4.Latest 上游不停发射消息,下游阻塞,放入缓存池,如果池子满了,只存储128个事件

如果是同步的,下游没有调用request(),会抛异常,而如果是异步的,不执行request(),上游不会等待下游,不会抛出异常,所以外界可以调用

RxJava背压模式  Flowable 讲解

Observable---Observer

Flowable---Subscriber

c的设计和Flowable一致的,只不过Flowable增加了背压模式

Flowable下游,Subscription可以传递给外部使用,request(),事件给下游使用

RxJava+Retrofit(封装了OkHttp)

Retrofit请求网络

Retrofit返回一个结果---Observable

最终的结果是RxJava中的被观察者 上游Observable

RxJava泛型高级进阶

由于RxJava大量使用泛型 

限定   通配符 ? 上限 extends 

                          下限 super


读写模式  上限  不可写  可读

                 下限  可写   不完全可读

RxJava手写系列

RxJava书写create操作符

源码

public class Observable {

public Observable(ObservableOnSubscibe subscibe) {

this.subscibe = subscibe;

    }

private ObservableOnSubscibesubscibe;

    public static Observablecreat(ObservableOnSubscibe subscibe) {

return new Observable(subscibe);

    }

public void subscibe(Observer observer){

        observer.onSubscibe();

        subscibe.subscribe(observer);

    }//调用onSubscibe订阅成功,将observer传入subscibe,将执行subscibe里面的方法

}

public interface ObservableOnSubscibe {

public void subscribe(Observer observer);

}

public interface Observer {

public void onSubscibe();

    public void onNext(T item);

    public void onError(Throwable e);

    public void onComplete();

}

RxJava书写create增加读写操作符

什么时候是读写模式  什么时候是上限、下限模式

在方法参数中,show(Test<? extends Object>) 一定是上限和下限

 在真正使用到泛型中,一定是读写模式

RxJava书写just操作符

just操作符思路和流程和create是完全一致的,使用上的区别主要是create是用户自己发射,自己调用onNext(),而just是内部自己发射。

RxJava书写map操作符

public class Observable {

public Observable(ObservableOnSubscibe subscibe) {

this.subscibe = subscibe;

    }

private ObservableOnSubscibesubscibe;

    public static Observablecreat(ObservableOnSubscibe subscibe) {

return new Observable(subscibe);

    }

public void subscibe(Observer observer){

observer.onSubscibe();

        subscibe.subscribe(observer);

    }

public Observable map(Function function){

MapObservable mapObservable=new MapObservable(function,subscibe);

        return new Observable(mapObservable);

    }//添加map方法,链式调用返回Observable

}

public class MapObservableimplements ObservableOnSubscibe {

private Functionfunction;

    private ObservableOnSubscibesource;//管理上一层

    private ObserverobserverEmitter;//管理下层

    public MapObservable() {

}

@Override

    public void subscribe(Observer observerEmitter) {

this.observerEmitter = observerEmitter;

        MapObserver mapObservable =new MapObserver(observerEmitter, source, function);

        source.subscribe(mapObservable);

    }

public MapObservable(Function function, ObservableOnSubscibe source) {

Log.e("fsfsgsgs","MapObservable");

        this.function = function;

        this.source = source;

    }

class MapObserverimplements Observer {

private ObserverobserverEmitter;//管理下层

        private ObservableOnSubscibesource;//管理上一层

        private Functionfunction;

        public MapObserver(Observer observerEmitter, ObservableOnSubscibe source, Function function) {

this.observerEmitter = observerEmitter;

            this.source = source;

            this.function = function;

        }

@Override

        public void onSubscibe() {

observerEmitter.onSubscibe();

        }

@Override

        public void onNext(T item) {

R type =function.apply(item);

            observerEmitter.onNext(type);

        }

@Override

        public void onError(Throwable e) {

observerEmitter.onError(e);

        }

@Override

        public void onComplete() {

observerEmitter.onComplete();

        }

}

}

public interface Function {

public R apply(T t);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 转载自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657阅读 2,021评论 1 9
  • RxJava详解(一) 年初的时候就想学习下RxJava然后写一些RxJava的教程,无奈发现已经年底了,然而我还...
    CharonChui阅读 2,421评论 0 0
  • RxJava RxJava是响应式程序设计的一种实现。在响应式程序设计中,当数据到达的时候,消费者做出响应。响应式...
    Mr槑阅读 947评论 0 5
  • 核心:异步 观察者模式 作用:RxJava的特点就是可以非常简便的实现异步调用,可以在逻辑复杂的代码逻...
    暗尘随码去阅读 698评论 0 3
  • 我在一切还来得及的幻觉中等你,等待一个沉睡在我的臆想中的你。 于是这种等待虚假又毫无意义,我知道你并不会来,像冬日...
    四喜没丸子阅读 86评论 0 1