RxKotlin 例子不超过15行教程 3----Observable 的创建

这节就认认真真的开始讲 Observable.

创建一个 Observable

两段能跑的代码

本节代码中的 observer 就是上一节中的

// 3.1.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    val observable: Observable<Int> = Observable.create<Int> {
        // it: ObservableEmitter<String!>
        it.onNext(1)
        it.onNext(2)
        it.onNext(3)
        it.onComplete()
    }

    observable.subscribe(observer) // observer 同上一节
}

输出

New Subscription
Next 1
Next 2
Next 3
All Completed

再来一段报错的代码

// 3.2.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    val observable: Observable<Int> = Observable.create<Int> {
        // it: ObservableEmitter<String!>
        it.onNext(1)
        it.onNext(2)
        it.onNext(3)
        it.onError(Exception("My Custom Exception"))
    }

    observable.subscribe(observer) // observer 同上一节
}

输出

New Subscription
Next 1
Next 2
Next 3
Error Occured My Custom Exception

上面两段代码的主旨 -- Observable.create

我们可以通过 Observable.create 来创建 Observable
这个函数是一个高阶函数,它接收另一个(以 ObservableEmitter 为参数的)函数为参数,返回一个 Observable。我们可以在函数中利用 ObservableEmitter 弹射消息。(在这里 it 即为 ObservableEmitter(Kotlin 中 Lambda 函数如果只有一个参数,可以省略声明,在函数体中以 it 指代))
ObservableEmitter 目前能用上的有三个方法

  • onNext: 弹射消息
  • onComplete: 弹射结束标志
  • onError: 弹射错误

注意,这三者都可以省略

// 3.3.kt
// 省略 onComplete
import io.reactivex.Observable

fun main(args: Array<String>) {
    val observable: Observable<Int> = Observable.create<Int> {
        it.onNext(1) // 其实它也可省,可以删除看看效果
    }

    observable.subscribe(observer)
}

输出

New Subscription
Next 1

可以看到订阅依然会停止,但是不会调用 observer 的 onComplete 方法(和 3.1.kt 输出结果比较一下,少了最后一行)
弹射结束标志后 Observable 还可以弹射消息,但是 Observer 却不会对这些消息作出反应。可以看下面的例子。

// 3.4.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    val observable: Observable<Int> = Observable.create<Int> {
        it.onComplete()
        it.onNext(1)
    }

    observable.subscribe(observer)
}

输出

New Subscription
All Completed

All Completed 之后没有继续输出 Next 1

创建 Observable 的基本方法 -- Observable.fromX 与 Observable.just

Observable.fromX

// 3.5.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3, 4)
    val observable: Observable<Int> = Observable.fromIterable(list)
    // 我们也可以用 list.toObservable() 替代 Observable.fromIterable(list)
    observable.subscribe(observer)
}

输出

New Subscription
Next 1
Next 2
Next 3
Next 4
All Completed

Observable.just

// 3.6.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    Observable.just(54).subscribe(observer)
    Observable.just(listOf(1, 2, 3)).subscribe(observer)
    Observable.just(1, 2, 3).subscribe(observer)
}

输出

New Subscription
Next 54
All Completed
New Subscription // 注释1
Next [1, 2, 3]
All Completed
New Subscription // 注释2
Next 1
Next 2
Next 3
All Completed

可以看到 just 会把每个参数当作一个整体(注释1)(而 from 会把参数展开,下面有直观对比的例子)。如果有多个参数会把它们一个一个的弹出来(注释2)。

just 与 fromX 的区别

// 3.7.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    // 下面两者等效
    Observable.just(1, 2, 3).subscribe(observer)
    Observable.fromIterable(listOf(1, 2, 3)).subscribe(observer)
}

输出

New Subscription
Next 1
Next 2
Next 3
All Completed
New Subscription
Next 1
Next 2
Next 3
All Completed

just fromX 与 create 的区别

create 中需要显式弹射结束标志(it.onComplete()),Observer 才会调用 onComplete 方法 (3.3.kt 中,没有 it.onComplete() 输出中就没有 All Completed)
just fromX 会自动弹射结束标志 (3.6.kt 3.7.kt 3.8.kt 中均有输出 All Completed)

创建 Observable 的其它常用方法

empty 没有值

// 3.8.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    Observable.empty<String>().subscribe(observer)
}

输出

New Subscription
All Completed

interval 隔一定的时间弹射一个值

// 3.9.kt
import io.reactivex.Observable
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    Observable.interval(600, TimeUnit.MILLISECONDS).subscribe(observer)
    Thread.sleep(2000) // 要有这一行
}

输出

New Subscription
Next 0
Next 1
Next 2

timer 一段时间后弹射一个值

// 3.10.kt
import io.reactivex.Observable
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    Observable.timer(20, TimeUnit.MILLISECONDS).subscribe(observer)
    Thread.sleep(50) // 要有这一行
}

输出

New Subscription
Next 0
All Completed

range 一个范围内依次弹射

// 3.11.kt
import io.reactivex.Observable

fun main(args: Array<String>) {
    Observable.range(1, 3).subscribe(observer)
}

输出

New Subscription
Next 1
Next 2
Next 3
All Completed

这节基本上OK了,下一节主要内容是 Observer subscribeHot/Cold Observable

RxKotlin 例子不超过15行教程 1----环境配置与初体验

RxKotlin 例子不超过15行教程 2----Observable Observer 与 Subscribe 简介

RxKotlin 例子不超过15行教程 3----Observable 的创建

RxKotlin 例子不超过15行教程 4----Observer Subscribe 与 Hot/Cold Observable

RxKotlin 例子不超过15行教程 5----Subject

RxKotlin 例子不超过15行教程 6----Operator 与 Marble Diagram

RxKotlin 例子不超过15行教程 7----Backpressure Flowable 与 Subscriber 简介

RxKotlin 例子不超过15行教程 8----Error Handling

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

推荐阅读更多精彩内容