RxJava中observeOn和subscribeOn的区别

72 阅读1分钟

切换次数:

observeOn可以来回切换各种线程。

subscribeOn只能切换一次。

对上游的影响:

observeOn只对下游的操作有影响,不影响上游, 控制事件的消费。

subscribeOn影响上游的操作,控制事件的产生。

import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.schedulers.Schedulers

fun main() {
    Observable.create { emit ->
        emit.onNext(Thread.currentThread().name)
    }.subscribe { name->
        println("Thread1 name is $name")
    } // 原始代码

    Observable.create { emit ->
        emit.onNext(Thread.currentThread().name)
    }.observeOn(Schedulers.io()).subscribe { name->
        println("Thread2 name is $name")
    } // observeOn不改变上游线程

    Observable.create { emit ->
        emit.onNext(Thread.currentThread().name)
    }.subscribeOn(Schedulers.io()).subscribe { name->
        println("Thread3 name is $name")
    } //subscribeOn可以改变上游线程,影响事件发生时的线程

    Observable.create { emit ->
        emit.onNext(Thread.currentThread().name)
    }.observeOn(Schedulers.io()).map { name ->
        println("Thread4 name is $name")
        Thread.currentThread().name
    }.subscribe {
        println("Thread5 name is $it")
    } // observeOn可以改变下游线程

    Observable.create { emit ->
        emit.onNext(Thread.currentThread().name)
    }.subscribeOn(Schedulers.computation()).subscribeOn(Schedulers.io()).subscribe {
        println("Thread6 name is $it")
    }  //subscribeOn只有第一次使用生效

    Observable.just(1).observeOn(Schedulers.computation()).map {
        println("Thread7 name is ${Thread.currentThread().name}")
    }.observeOn(Schedulers.io()).subscribe {
        println("Thread8 name is ${Thread.currentThread().name}")
    }  //observeOn可以多次使用,多次生效

    Thread.sleep(1000)
}

输出结果:

Thread1 name is main
Thread2 name is main
Thread3 name is RxCachedThreadScheduler-2
Thread4 name is main
Thread5 name is RxCachedThreadScheduler-2
Thread6 name is RxComputationThreadPool-1
Thread7 name is RxComputationThreadPool-2
Thread8 name is RxCachedThreadScheduler-4