RxJava2--基本使用

RxJava2介绍

RxJava是通过事件传递,并且在传递过程中对事件内部数据进行修改,最终发送给接收者的响应式框架。

借助某个同学的一张图可以更直观的了解:


RxJava事件流向

上图只是在同个线程中,可以让事件携带数据按顺序从上层流转到下层。而在事件流转的过程中,RxJava提供了很多操作符可以对源头事件进行处理再往下传递。

RxJava2的优势

  1. 书写简便,没有层层回调
  2. 流式调用,可以简单的看出来整个过程
  3. 操作符非常强大,可以在事件流转中间进行各种处理
  4. 可以保证多线程之间事件的顺序(不过数据同步需要自己保证)

RxJava2的配置

在Module中引入即可:

compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

RxJava2中基本类介绍

Observable:一个可被subscribe的对象,也可以理解成被监听的对象,而该对象中保存着一个名为ObservableEmitter的对象,ObservableEmitter对象就是上面提到的发送事件的对象。

Observer:接收Observable发送事件的对象。

Consumer: 只接收onNext事件的对象

本质RxJava就是一套非常强大的Observer框架

Observable与Observer基本使用

Observable对象中调用onNext发射(Emitter)了12,以及ErrorComplete这四个事件。
而在Observer对应的几个响应函数中打印日志(为了方便,把Log.e替换成了System.out.println)。

 Observable.create<Int> { emitter ->
            Log.e(TAG, "Emitter onNext1...${Thread.currentThread().name}")
            emitter.onNext(1)
            Log.e(TAG, "Emitter onNext2...${Thread.currentThread().name}")
            emitter.onNext(2)
            Log.e(TAG, "Emitter onError...${Thread.currentThread().name}")
            emitter.onError(NullPointerException())
            Log.e(TAG, "Emitter onComplete...${Thread.currentThread().name}")
            emitter.onComplete()
        }.subscribe(object : Observer<Int> {
            override fun onComplete() = System.out.println("onComplete...${Thread.currentThread().name}")
            override fun onSubscribe(d: Disposable?) = System.out.println("onSubscribe...${Thread.currentThread().name}...Disposable:$d")
            override fun onNext(value: Int?) = System.out.println("onNext...${Thread.currentThread().name}...Value:$value")
            override fun onError(e: Throwable?) = System.out.println("onError...${Thread.currentThread().name}...Throwable:$e")
        })

而在同一个线程中,输出结果如下:

 E/SelectImageActivity: onSubscribe...main...Disposable:null
 E/SelectImageActivity: Emitter onNext1...main
 E/SelectImageActivity: onNext...main...Value:1
 E/SelectImageActivity: Emitter onNext2...main
 E/SelectImageActivity: onNext...main...Value:2
 E/SelectImageActivity: Emitter onError...main
 E/SelectImageActivity: onError...main...Throwable:java.lang.NullPointerException
 E/SelectImageActivity: Emitter onComplete...main

可以发现:

1. 在同一个线程中,发送一个事件,就会接收一个事件,再发送下一个事件
2. 在发送完onError事件后,即使发送了onComplete事件,也无法接收
3. 在发送完onComplete事件后,再发送了onError事件,则会将该Throwable对象抛出,出现crash
4. 在发送完onCompleteonError事件后,再发送onNext事件,则无法接收

事件的消费者Consumer

在大多数情况下,我们只用关心onNext或者onError单独的事件,而对于其他的事件均不关心,这种情况下,我们就可以使用Consumer对象

对于subscribe函数的重载函数有这些:

public final void subscribe(Observer<? super T> observer) 
public final Disposable subscribe(Consumer<? super T> onNext)
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError)
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete)
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,Action onComplete, Consumer<? super Disposable> onSubscribe)

举例,我们只关心onNext事件,则可以这样来表示:

Observable.create<Int> { emitter ->
            Log.e(TAG, "Emitter onNext1...${Thread.currentThread().name}")
            emitter.onNext(1)
            Log.e(TAG, "Emitter onNext2...${Thread.currentThread().name}")
            emitter.onNext(2)
            Log.e(TAG, "Emitter onComplete...${Thread.currentThread().name}")
            emitter.onComplete()
            Log.e(TAG, "Emitter onNext3...${Thread.currentThread().name}")
            emitter.onNext(3)
        }.subscribe { data ->
            Log.e(TAG, "onNext...$data")
        }

在接收端,仅仅只接收了onNext事件。

 E/SelectImageActivity: Emitter onNext1...main
 E/SelectImageActivity: onNext...1
 E/SelectImageActivity: Emitter onNext2...main
 E/SelectImageActivity: onNext...2
 E/SelectImageActivity: Emitter onComplete...main
 E/SelectImageActivity: Emitter onNext3...main

参考资料

给初学者的RxJava2.0教程
探索专为 Android 而设计的 RxJava 2

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

推荐阅读更多精彩内容