美文网首页禅与计算机程序设计艺术RxKotlinAndroid知识
RxKotlin 例子不超过15行教程 3----Observ

RxKotlin 例子不超过15行教程 3----Observ

作者: 蔡洪宇 | 来源:发表于2018-02-23 18:50 被阅读425次

    这节就认认真真的开始讲 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

    相关文章

      网友评论

      • 木米小雨:大佬,文章很有帮助,非常感谢
      • 咔dua翠嘞:再赞一个再说
        蔡洪宇:@咔dua翠嘞 并发那一节想了好久,一直想把异步并发这些写透,结果资料越查越多一拖再拖😷
        蔡洪宇:@咔dua翠嘞 Hi, 其实我是想留到第十节并发那里说的,这是一个好问题。
        普通的生成方式会在没有把值全部弹出之前会阻塞当前线程,而timer和interval会在另一个线程中弹出值,所以不 sleep 的话就看不到它们了。
        咔dua翠嘞:interval跟timer为什么要有sleep
      • 神经病人思路广:先赞一个再说
        蔡洪宇:@神经病人思路广 开心

      本文标题:RxKotlin 例子不超过15行教程 3----Observ

      本文链接:https://www.haomeiwen.com/subject/xdpxxftx.html