切换次数:
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