记:学习RxJava的小笔记

知识点1.简单了解RxJava

RxJava是基于事件流的链式调用,实现异步操作的库
RxJava属于一种特殊的观察者模式

知识点2.RxJava中4种角色

被观察者Observable:产生事件
观察者Observe:接收事件并作出对应的响应
订阅Subscribe:连接Observable和Observe
事件Event:Observable和Observe沟通载体

知识点3.原理

被观察者通过订阅按顺序发送事件给观察者,观察者按顺序接收事件并作出响应动作

知识点4.举例常用链式调用方法

导入包: compile "io.reactivex.rxjava2:rxjava:2.2.4"

        //第一步,先创建被观察者Observable
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Exception {
                //按顺序发送事件
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);

                //如果调用onComplete(),观察者会调用onComplete()方法
                emitter.onComplete();
                //2
            }
        }).subscribe(new Observer<Integer>() {
            //第二步订阅
            //第三步创建观察者
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.e(TAG, "onSubscribe");
                //1
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                Log.e(TAG, "接收到:" + integer);
                //3
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG, "onError");

            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete");
                //4
            }
        });

打印结果:

12-18 11:31:44.314 32019-32019/test.danny.com.rxjavademo E/MainActivity: onSubscribe
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:1
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:2
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:3
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: onComplete

由此可知(也可看上面数字标注顺序1234)回调执行顺序为:
观察者onSubscribe>被观察者subscribe()>onNext()>onComplete()

知识点5.丰富的操作符

https://www.jianshu.com/u/383970bef0a0
//2018-12-19 作者下面非常全,我还没学完(map,flatMap,contactMap,Buffer)...

知识点6.RxJava无条件网络请求轮询

https://www.jianshu.com/p/11b3ec672812

知识点7.创建观察者两种方式的区别(Observable、Subscriber)

相同:使用完全相同(在实际使用中,Observable总被转换成Subscriber)
不同:Subscriber扩展了Observable,新增了onStart()和unsubscribe()方法

知识点8.Disposable

当执行到了观察者的onComplete()或onError(),就相当于切断了观察者和被观察者之间的联系。同时若自行调用了Disposable.dispose(),也是切断了联系

知识点9.变换操作符

(此处可使用操作符非常多,以后继续补充)
应用场景:网络嵌套,即执行完接口1,再执行接口2
(1)Map():将被观察者发送的事件转换为任意的类型事件
Observable>发送事件>Map转换发送转换后事件>订阅>观察者接收到的是转换后的事件
(2)flatMap():将被观察者发送事件序列进行拆分&单独转换,在合并成一个新的事件序列,在发送
原理:
a.为事件每个事件创建1个Observable对象
b.将每个原始事件转换后新事件都放入对应的Observable对象
c.将新建每一个都合并到新建的总的Observable对象
d.把新建的总的Observable对象发给Observer观察者
注意:新的Observable对象事件是无序
(2)concatMap():与flatMap()类似,区别在于flatMap()最后新的事件顺序是无序,而concatMap是有序
(3)Buffer():定期从Observable需发送事件中,获取一定数量事件放缓存区,并最终发送

知识点10.几点RxJava原理个人理解

(1)Observable是采用链式调用,和我们平时使用的Builder建造者模式不同的是,平时builder每次返回都是同一个对象。而在这里,返回是每次都会创建一个新的Observable或Observable的子类
(2)所有的业务都是在执行了subscribe()方法之后执行的,观察者回调了被观察者的subscribe(),并把订阅者以参数的形式交还给事件源,将它们连接了起来。被观察者onSubscribe中发送的事件,其实相当于观察者的onNext()

subscribe部分理解.png

知识点11.map操作符原理?不是很懂,希望有懂的能给我指点一下

大概意思是,创建新的观察者与被观察者,但是被观察者的onSubscribe()一直回调是之前的,逐级建立订阅。执行顺序不是顺序执行,而需回调来执行???

知识点12.线程切换(*)
为什么会用到线程切换?

当被观察者在subscibe发送耗时的任务时,为了不堵塞主线程。因为Observable和Observe,创建在哪个线程,方法就会执行在哪个线程

理想型怎么实现?

被观察者在子线程中执行耗时操作,回调给观察者在主线程进行UI处理。使用线程切换,也称为调度/切换

如何实现?

RxJava内置调度器(Scheduler):可以指定Observable及Observe的工作线程
被观察者Observable:subscribeOn(Schedulers.newThread()))(Schedulers有多个可选的方式可自行baidu)切换此线程进行耗时操作
观察者Observe:observeOn(AndroidSchedulers.mainThread())切换主线程处理结果(内部使用了Handler)

线程切换原理?

附一个地址觉得讲得很好https://www.jianshu.com/p/4e78d447394e
subscribeOn(Schedulers.newThread():原理就是在指定线程中向上游订阅(白话就是在指定线程中去调上游的subscribe方法,x我理解的是:相当于多次调用,之后的每次指定线程都依次向上,直到第一个指定的位置。所以会有多次指定只有第一次有效的说法)
observeOn(AndroidSchedulers.mainThread():原理是收到数据后在指定的线程中调用下游的回调方法(onNext/onError/onComplete等),即这之后的所有操作方法都会在最后一次调用指定线程中实现(我的理解:相当于多次调用顺序从上到下,是以最后一次指定线程为准。所以会有多次指定每指定一次切换一次的说法)

线程切换简单理解顺序.jpg

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

推荐阅读更多精彩内容