观察者

127 阅读2分钟

所谓的观察者模式,就好比,老师在教室上课,学生在教室听课,这里的老师就是被观察者,而这时候的在听课的学生就是观察者,老师通过说话,来传递知识,老师每说一个知识,学生都会实时做出相应的反映,这就是所谓的观察者模式。

也有人理解为事件的订阅,再以事件的订阅打个比喻,假设现在有个Android授课老师在讲课,有想学习Android的学生想实时的学习到新的Android知识,那怎么办,没错那就是必须的关注这个老师,你才能实时的获取到最新的Android知识,这里的关注就是,关注的过程就是事件的订阅。

val observable = Observable.create<String> { emitter ->
    emitter.onNext("111")
    emitter.onNext("2222")
    emitter.onComplete()
}

var observerA = object :Observer<String>{
    override fun onSubscribe(d: Disposable) {
        println("A-订阅了")
    }

    override fun onNext(t: String) {
        println("A-收到了:${t}")
    }

    override fun onError(e: Throwable) {
        println("A-错误")
    }

    override fun onComplete() {
        println("A-关闭了")
    }
}
var observerB = object :Observer<String>{
    override fun onSubscribe(d: Disposable) {
        println("B-订阅了")
    }

    override fun onNext(t: String) {
        println("B-收到了:${t}")
    }

    override fun onError(e: Throwable) {
        println("B-错误")
    }

    override fun onComplete() {
        println("B-关闭了")
    }
}


observable.subscribe(observerA)
observable.subscribe(observerB)

微信截图_20250507164334.png

subscribeOn(Schedulers.io())

  • 作用:指定 Observable 发射数据项执行操作所在的线程

  • 位置:通常放在链式调用的前面

  • 特点

    • 整个 Observable 的操作(包括创建、发射数据等)会在指定的线程上执行
    • 如果多次调用 subscribeOn(),只有第一个会生效
  • Schedulers.io()

    • 专门用于 I/O 密集型操作的线程池
    • 适合网络请求、文件读写等操作
    • 线程池会根据需要动态增长

observeOn(AndroidSchedulers.mainThread())

  • 作用:指定 Observer 接收和处理数据所在的线程

  • 位置:通常放在链式调用的后面,在订阅之前

  • 特点

    • 可以多次调用,每次调用会影响后续操作的线程
    • 通常用于将结果切换到主线程更新 UI
  • AndroidSchedulers.mainThread()

    • RxAndroid 提供的调度器
    • 确保操作在主线程(UI 线程)执行