RxJava(RxKotlin)、RxAndroid 簡單使用

hahadelphi發表於2021-09-09

RxJava(RxKotlin)、RxAndroid

ps:文章中涉及到的程式碼均使用 Kotlin 實現,即需要匯入 RxKotlin,同時也涉及到了 RxAndroid 相關內容

匯入方法:

  1. 在專案的 build.gradle 檔案中新增 RxKotlin 的版本資訊

buildscript {
    ext.rx_kotlin_version = '1.0.0'
    ext.rx_android_version = '1.2.1'}
  1. 在 module 的 build.gradle 檔案中新增 RxKotlin 以及 RxAndroid 的依賴

dependencies {
    // RxKotlin RxAndroid
    implementation "io.reactivex:rxkotlin:$rx_kotlin_version"
    implementation "io.reactivex:rxandroid:$rx_android_version"}

1. 一些常用的網站


2. 觀察者模式的四大要素

  1. Observable 被觀察者

  2. Observer 觀察者

  3. subscribe 訂閱

  4. 事件


3. 運算子

3.1 Creating 運算子

create
justfromrange
repeat
interval
defer
empty / never
timer
start
  • create 運算子,直接建立一個 Subscriber 物件

Observable.create<String> {
    it.onNext("Hello Rx!")
    it.onCompleted()
}.subscribe(object : Subscriber<String>() {    override fun onNext(t: String) {
        println("onNext() --> $t")
    }    override fun onCompleted() {
        println("onCompleted()")
    }    override fun onError(e: Throwable?) {
        println("onError()")
    }
})
onNext() --> Hello Rx!
onCompleted()
  • just 運算子將一系列物件逐個發射出去,注意集合物件將作為一個整體進行發射

Observable.just(1, 1.0, "String", true)
        .subscribe(object : Subscriber<Any>() {            override fun onNext(t: Any) {
                println("onNext() --> $t")
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })

Observable.just(listOf(1, 2, 3, 4, 5))
        .subscribe(object : Subscriber<List<Int>>() {            override fun onNext(t: List<Int>) {
                t.forEach { println("onNext() --> $it") }
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })
onNext() --> 1onNext() --> 1.0onNext() --> StringonNext() --> trueonCompleted()
onNext() --> 1onNext() --> 2onNext() --> 3onNext() --> 4onNext() --> 5onCompleted()
  • from 運算子可以將集合中的元素逐個發射出去

Observable.from(listOf(5, 4, 3, 2, 1, 0))
        .subscribe(object : Subscriber<Int>() {            override fun onNext(t: Int) {
                println("onNext() --> $t")
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })
onNext() --> 5
onNext() --> 4
onNext() --> 3
onNext() --> 2
onNext() --> 1
onNext() --> 0
onCompleted()
  • range 在一定範圍內向觀察者發射整型資料,repeat 重複發射,預設重複無數次

Observable.range(1, 3)
        .repeat(2)
        .subscribe(object : Subscriber<Int>() {            override fun onNext(t: Int) {
                println("onNext() --> $t")
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })
onNext() --> 1
onNext() --> 2
onNext() --> 3
onNext() --> 1
onNext() --> 2
onNext() --> 3
onCompleted()
  • interval 定時向觀察者傳送一個 Long 型別的數字(逐個疊加)

Observable.interval(2, 2, TimeUnit.SECONDS)
        .subscribe(object : Subscriber<Long>() {            override fun onNext(t: Long) {
                println("onNext() --> $t")
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })
onNext() --> 0
onNext() --> 1
onNext() --> 2
onNext() --> 3
...
  • defer 延遲建立 Observable 物件,只有在呼叫 subscribe() 方法時,才會建立 Observable 物件

var arg = "初始值"val observable = Observable.defer { Observable.just(arg) }
arg = "再次賦值"observable.subscribe(object : Subscriber<String>() {    override fun onNext(t: String) {
        println("onNext() --> $t")
    }    override fun onCompleted() {
        println("onCompleted()")
    }    override fun onError(e: Throwable?) {
        println("onError()")
    }
})
onNext() --> 再次賦值
onCompleted()

3.2 Transforming 運算子

mapflatMap
groupBy
buffer
scan
window
  • map

Observable.just(123, 234).map {       "¥ $it"
   }.subscribe(object : Subscriber<String>() {       override fun onNext(t: String) {
           println("onNext() --> $t")
       }       override fun onCompleted() {
           println("onCompleted()")
       }       override fun onError(e: Throwable?) {
           println("onError()")
       }
   })
onNext() --> ¥ 123
onNext() --> ¥ 234
onCompleted()
  • flatMap

Observable.just(123, 234, 345)
        .flatMap {
            Observable.just("$ $it")
        }.subscribe(object : Subscriber<String>() {            override fun onNext(t: String) {
                println("onNext() --> $t")
            }            override fun onCompleted() {
                println("onCompleted()")
            }            override fun onError(e: Throwable?) {
                println("onError()")
            }
        })
onNext() --> $ 123onNext() --> $ 234onNext() --> $ 345onCompleted()
  • groupBy

Observable.just(1, 2, 3, 4, 5, 6)
        .groupBy { it % 2 }
        .subscribe(object : Observer<GroupedObservable<Int, Int>> {            override fun onError(e: Throwable?) {
            }            override fun onNext(t: GroupedObservable<Int, Int>) {
                t.subscribe(object : Subscriber<Int>() {                    override fun onNext(r: Int) {
                        println("group -> ${t.key}, value -> $r")
                    }                    override fun onCompleted() {
                    }                    override fun onError(e: Throwable?) {
                    }
                })
            }            override fun onCompleted() {
            }
        })
group -> 1, value -> 1
group -> 0, value -> 2
group -> 1, value -> 3
group -> 0, value -> 4
group -> 1, value -> 5
group -> 0, value -> 6
  • buffer

Observable.range(0, 7)
        .buffer(3)
        .subscribe(object : Subscriber<List<Int>>() {            override fun onNext(t: List<Int>) {
                println(t)
            }            override fun onCompleted() {
            }            override fun onError(e: Throwable?) {
            }
        })
[0, 1, 2]
[3, 4, 5]
[6]



作者:ChenME
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2471/viewspace-2817508/,如需轉載,請註明出處,否則將追究法律責任。

相關文章