RxAndroid 1.0,2.0版本以及主要原理

参考学习资料 1.0版本

http://gank.io/post/560e15be2dca930e00da1083 扔物线
https://github.com/lzyzsd/Awesome-RxJava 大头鬼

一、基础
 Observables(被观察者,事件源)和Subscribers(观察者)Observables发出一系列事件,Subscribers处理这些事件

一个Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。

建议先看大头鬼的hello world 的例子 (建议码一遍)
http://blog.csdn.net/lzyzsd/article/details/41833541

Action1<String> onNextAction=new Action1<String>() {   
 @Override    public void call(String s) {   
     System.out.println(s);   
 }};

应用场景

1.Observable和Subscriber可以做任何事情Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。

 left原理:都是基于一个lift(operator)
 *  Observable 在执行了left之后, 会返回一个新的Observable,这个Observable就像一个代理一样,负责接受原始的Observable发出的事件。并在处理后发送给Subscriber。更像是一种代理机制,通过事件拦截和处理实现时间序列的变换。
  subscribeOn()和 observeOn区别:
 *  1.subscribeOn()线程切换发生在Onsubscribe中,即在它通知上一级OnSubscribe时,这时事件还没有开始发送,因此subscribeOn()的线程控制,
 * 可以从事件发出的开端就做成了影响。
 * 2.observeOn()的线程切换发送在它内建Subscriber中,即发生在它即将给下一级Subscriber发送事件时,因此observeOn()控制的是它后面的线程。
 *

Observable.doOnSubscribe() 和 Subscriber.onStart() 同样是在 subscribe() 调用后而且在事件发送前执行, 但是Observable.doOnSubscribe()可以指定线程,默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。

2.0版本###

导包给我搞吐
包名开头 最旧 rx-->io 最新

2.0 最核心的是Publisher 和 Subscriber。 Publisher 发出一系列的时间,Subscriber负责和处理事件。

具体讲解

背压#####

在rxjava中有多重控制流以及背压(backpressure)策略用来应对当一个快速发送消息的被观察者遇到一个处理消息缓慢的观察者。

Flowable的三种Backpressure策略:

BackpressureStrategy.BUFFER####

onBackpressureBuffer是不丢弃数据的处理方式。把上游收到的全部缓存下来,等下游来请求再发给下游。相当于一个水库。但上游太快,水库(buffer)就会溢出。

BackpressureStrategy.DROP####

BackpressureStrategy.LATEST####

Drop 和Latest 类似,都会丢弃数据,下游通过request请求产生令牌给上游,上游接收到多少令牌,就发送多少,当令牌为0的时候,上游开始丢弃数据。区别在于,drop直接丢弃数据不缓存数据。而latest缓存最新的一条数据,当上游收到令牌,就把缓存的上一条“最新”数据发送给下游。

何时用Observable####

当上游在一段时间发送的数据量不大(以1000为界限)的时候优先选择使用Observable;
在处理GUI相关的事件,比如鼠标移动或触摸事件,这种情况下很少会出现backpressured的问题,用Observable就足以满足需求;
获取数据操作是同步的,但你的平台不支持Java流或者相关特性。使用Observable的开销低于Flowable。

何时用Flowable####

当上游在一段时间发送的数据量过大的时候(这个量我们往往无法预计),此时就要使用Flowable以限制它所产生的量的元素10K +处理。
当你从本地磁盘某个文件或者数据库读取数据时(这个数据量往往也很大),应当使用Flowable,这样下游可以根据需求自己控制一次读取多少数据;
以读取数据为主且有阻塞线程的可能时用Flowable,下游可以根据某种条件自己主动读取数据。

在RxJava2.0中,有五种观察者模式:####

Observable/Observer
Flowable/Subscriber

Single/SingleObserver
Completable/CompletableObserver
Maybe/MaybeObserver

Observable 写法:####

Observable-->Observer

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
        emitter.onNext(1);
        emitter.onNext(2);
        emitter.onComplete();
    }
}).subscribe(new Observer<Integer>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(Integer integer) {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

Flowable写法###

Flowable-->subscriber

Flowable.range(0, 10)
        .subscribe(new Subscriber<Integer>() {
            Subscription subscription;

            //当订阅后,会首先调用这个方法,其实就相当于onStart(),
            //传入的Subscription s参数可以用于请求数据或者取消订阅
            @Override
            public void onSubscribe(Subscription s) {
                Log.d(TAG, "onsubscribe start");
     ## 这里需要特别注意。s.request()去请求资源,参数就是要请求的数量,一般如果不限制,写成Long.MAX_VALUE。如果不调用request, onNext()和onComplete方法将不会被调用。
                subscription = s;
                subscription.request(1);
                Log.d(TAG, "onsubscribe end");
            }

            @Override
            public void onNext(Integer o) {
## onNext 方法里面传入的参数就是Flowable 中发射出来的。
                Log.d(TAG, "onNext--->" + o);
                subscription.request(3);
            }

            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });

如果只关注onNext(),可以

Consumer consumer=new Consumer<String>(){
  @Override
  public void accept(String s) throws Exception{
    System.out.println(s);
  }
}
Actions

为了减少组件数量,2.x中没有定义Action3-Action9和ActionN。

保留的action接口按照Java 8 functional风格命名。 无参数的Action0 被操作符io.reactivex.functions.Action和Scheduler代替。

Action1被重命名为Consumer。Action2 被重命名为BiConsumer。 ActionN 被Consumer<Object[]> 代替。##

Functions

我们按照Java 8的命名风格定义了io.reactivex.functions.Function 和io.reactivex.functions.BiFunction, 把Func3 - Func9 分别改成了 Function3 - Function9 。FuncN被Function<Object[], R>代替。

此外,操作符不再使用Func1<T, Boolean>但原始返回类型为Predicate<T>。

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

推荐阅读更多精彩内容