RxKotlin使用

原文地址:http://jbblog.top/MyBlog/html/blogpagecontent.html?id=53

RxKotlin
gradle里面引入:

implementation "io.reactivex:rxkotlin:1.0.0"
implementation "io.reactivex:rxandroid:1.2.1"


Rx 就是异步链式的方式。
以订阅者的方式来实现。
#### 主要有
Observable 被观察者
Observer 观察者
subscribe 订阅

## 1操作符
- create 操作符,直接创建一个 Subscriber 对象

Observable.create {
    it.onNext("Hello Rx!")
    it.onCompleted()
}.subscribe(object : Subscriber() {
    override fun onNext(t: String) {
        println("onNext() --> $t")
    }
    override fun onCompleted() {
        println("onCompleted()")
    }
    override fun onError(e: Throwable?) {
        println("onError()")
    }
})


- just 操作符将一系列对象逐个发射出去,注意集合对象将作为一个整体进行发射

Observable.just(1, 1.0, "String", true)
    .subscribe(object : Subscriber(){}
               
Observable.just(listOf(1, 2, 3, 4, 5))
        .subscribe(object : Subscriber>()

- range 在一定范围内向观察者发射整型数据,repeat 重复发射,默认重复无数次

Observable.range(1, 3)
        .repeat(2)

- interval 定时向观察者发送一个 Long 类型的数字(逐个叠加)

## 2.Transforming 操作符
- map用于数据类型转换,常见的应用场景比方说id应设成名称

Observable.just(1, 2, 3, 4)
.map {
when (it) {
1 -> "zhangsan"
2 -> "lishi"
3 -> "wangwu"
else -> "liuming"
} } .subscribeBy(onNext = { println(it) })
    
    print: zhangsan、lishi、wangwu、liuming

- flatMap操作类似于Map,但是Map转换是T -> D,但是flatMap是T ->Observable

fun getInfoById(id: Int): Observable {
    //模拟耗时请求
    return Observable.just(id)
}

Observable.just(1, 2, 3, 4)
            .flatMap { getInfoById(it) }
            .subscribeBy(onNext = { println(it)})

- filter用于过滤数据

Observable.just(1,2,3,4)
            .filter {  it > 2 }
            .subscribeBy(onNext = { println(it)})
                
输出:3、4


- groupBy 对数据进行分类。
- buffer对数据进行切片

Observable.range(0, 7)
        .buffer(3)
        .subscribe(object : Subscriber>() {
            override fun onNext(t: List) {
                println(t)
            }
            override fun onCompleted() {
            }
            override fun onError(e: Throwable?) {
            }
        })


- zip 用来合并两个 Observable 发射的数据项,根据 Func2() 函数指定的规则生成一个新的 Observable 并发射出去,当其中一个 Observable 发射数据结束或者出现异常后,另一个 Observable 也将停止发射数据

val observable1 = Observable.just(10, 20, 30)
val observable2 = Observable.just(1, 2, 3, 4)
Observable.zip(observable1, observable2) { o1, o2 ->
    o1 + o2
}.subscribe(object : Subscriber() {
    override fun onNext(t: Int) {
        println("onNext() --> $t")
    }
    override fun onCompleted() {
        println("onCompleted()")
    }
    override fun onError(e: Throwable?) {
        println("onError()")
    }
})

### 线程切换 [线程切换RxJava 2.0 使用](http://jbblog.top/MyBlog/html/blogpagecontent.html?id=47 "线程切换RxJava 2.0 使用")

你可能感兴趣的:(链式编程)