RxJava ——基础学习(一)

4个月前了解过一点点RxJava的皮毛,当时就经常看到Retrofit+MVP+RxJava这套组合,当时还在学校度过最后的时光,准备毕业设计,就也先看了一点,也写了一个非常笼统的学习博客。Android入门学习——RxJava+Retrofit+MVP学习 ,相信我,你看了也不会有啥帮助,因为我当时写的时候就啥都不会,门都没入,写的目的很大一部分是为了找工作能有额外的东西可说。: )

关于这套东西,我个人的建议是不要同时三个一起进行学习,尤其是新人,这套组合需要学的东西不少。对于和我一样的新人,我建议如下的学习顺序:

  1. 先学习MVP,这个入门最简单
  2. 学习OkHttp。把常用的方法学习学习,入门也并不困难。Retrofit底层还是OkHttp,遇到问题或者想实现一些需求,有时还得看OkHttp的东西,先了解OkHttp对于学习Retrofit有比较好的帮助。可以把鸿洋大神封装的OkHttpUtils敲了敲,学习一下怎么封装的。
  3. 学习RxJava。这个入门最困难也最耗时,东西多,而且并不是很容易理解。新人一般Java基础也不牢固,在学RxJava的时候,可以把Java的基础再巩固巩固。
  4. 最后Retrofit

补充:
0.若不了解Java8增加的知识点,先学习Java8的stream流。能帮助理解RxJava的操作符。传送门->Java8学习笔记


我的学习流程失误。我是了解了Lambda之后直接开始学习的RxJava,学习了RxJava的基本知识后又学习的Java8,但我个人感觉还是先学习Java8的知识点比较好。

本人太菜,会出很多错误,望指正。

学习资料:
扔无线大神的给 Android 开发者的 RxJava 详解
大头鬼大神的深入浅出RxJava系列
GitHub上的ReactiveX/RxJava文档中文版


1.HelloWord

用RxJava输出一下永恒的HelloWord。这里先大概浏览一遍,看完整篇后,再来看一遍。

public class RxJava_Demo_1 {
    public static void main(String[] agrs) {
        rxHello();
    }

    public static void rxHello() {
        //观察者
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {}
            @Override
            public void onError(Throwable e) {}
            @Override
            public void onNext(String s) {
                System.out.println(s);
            }
        };
        //被观察者
        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello world_1");
                subscriber.onNext("Hello world_2");
                subscriber.onNext("Hello world_3");
            }
        });
        //订阅
        observable.subscribe(observer);
    }
}


2.Observer(观察者)与Observable(被观察者)

  • Observer(观察者)——对Observable发来的数据或者数据序列做出响应。大白话就是,执行Observable发来的事件,决定事件触发的时候将有怎样的行为

  • Observable(被观察者)——它决定什么时候触发事件以及触发怎样的事件。一般需要Observable订阅(Subscribe)Observer之后起作用,才会发送事件。注意observable.subscribe(observer);

  • Subscriber(订阅者)——特殊的观察者,基本等价于Observer(观察者)。但有差别。Observer是一个接口,Subscriber是一个实现了Observer的观察者抽象类。但Subscriber实现的接口不只有Observer,还有另一个接口Subscription,这个接口它有一个unsubscribe()方法。至于SubscriberObserver的差别,目前只要晓得Subscriber增加了一个onStart()方法。


3.Subscribe(订阅)方法与取消订阅 (Unsubscribing)方法

subscribe()方法用于将观察者连接到Observable。但,正确的打开方式是observable.subscribe(observer);并不是订阅者(Observer)订阅被订阅者(Observable),而是难以理解的被订阅者(Observable)来订阅订阅者(Observer)。好绕口,这里先死记住。扔无线大神解释说“虽然更加符合思维逻辑,但对流式 API 的设计就造成影响了,比较起来明显是得不偿失的。”。嗯 ...,but what?新人还是不要太打破砂锅问到底了。死记。

unsubscribing()方法就相对好理解。就是取消观察者和被观察者间的联系。

调用这个方法表示你不关心当前订阅的Observable了,因此Observable可以选择停止发射新的数据项(如果没有其它观察者订阅)。
取消订阅的结果会传递给这个Observable的操作符链,而且会导致这个链条上的每个环节都停止发射数据项。这些并不保证会立即发生,然而,对一个Observable来说,即使没有观察者了,它也可以在一个while循环中继续生成并尝试发射数据项。

第二段,并不是很理解。是不是说,有时候Observablewhile循环中向Observer发送消息,取消订阅有可能不会立即生效,ObservableObserver并没有断开联系。也就是说尽量不要在while循环中使用Observable来发送消息?

另外,及时合理的调用unsubscribing()能够减少内存泄露的问题。


4.Observer(观察者)接口内的回调方法

  • onNext(T item)——被观察者(Observable)调用这个方法来发送数据。参数就是发送的数据。对于这个方法的理解,不要太在意名字,并不是下一次执行的意思。可以参考着Iteratornext()开进行理解。个人的感觉就是“执行”。

  • onError(Exception ex)——被观察者(Observable)遇到异常或者无法返回期望的而数据时,会调用这个方法。调用这个方法后,不会再调用onNext(T item)onComplete()方法

  • onComplete()——正常终止。被观察者(Observable)最后一次调用onNext(T item)方法后调用这个方法。

根据Observable协议的定义,onNext可能会被调用零次或者很多次。

onError(Exception ex)onComplete()是势不两立的,不会同时执行,只会有一个被调用。


5.操作符列表,看看就成,有个大概的印象

RxJava难点之一,就是操作符众多。而且大部分对新人来说并不好理解

1.创建操作—— Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer
2.变换操作—— Buffer, FlatMap, GroupBy, Map, Scan和Window
3.过滤操作—— Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take, TakeLast
4.组合操作—— And/Then/When, CombineLatest, Join, Merge, StartWith, Switch, Zip
5.错误处理—— Catch和Retry
6.辅助操作—— Delay, Do, Materialize/Dematerialize, ObserveOn, Serialize, Subscribe, SubscribeOn, TimeInterval, Timeout, Timestamp, Using
7.条件和布尔操作—— All, Amb, Contains, DefaultIfEmpty, SequenceEqual, SkipUntil, SkipWhile, TakeUntil, TakeWhile
8.算术和集合操作—— Average, Concat, Count, Max, Min, Reduce, Sum
9.转换操作—— To
10.连接操作—— Connect, Publish, RefCount, Replay
11.反压操作—— 用于增加特殊的流程控制策略的操作符

6. 最后

这几个单词,不敲几遍还真记不住。
永恒的Hello World!已经打印出来了。

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

推荐阅读更多精彩内容