RxJava2.x的理解与总结

时间:2023-01-30
本文章向大家介绍RxJava2.x的理解与总结,主要内容包括Observable、Observer、Scheduler、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

RxJava2.x的理解与总结

RxJava是一个基于观察者设计模式将链式编程和异步结合在一起的开源库。

链式编程

通过查看GitHub开源项目的简介开源知道,RxJava有几个基类。
他们分别适用于不同的场景

  1. io.reactivex.rxjava3.core.Flowable
  2. io.reactivex.rxjava3.core.Observable
  3. io.reactivex.rxjava3.core.Single
  4. io.reactivex.rxjava3.core.Completable
  5. io.reactivex.rxjava3.core.Maybe

上示例代码:

//被观察者
Observable.create(object : ObservableOnSubscribe<String> {
    override fun subscribe(emitter: ObservableEmitter<String>) {
        emitter.onNext("1")
        emitter.onNext("2")
        emitter.onNext("3")
        emitter.onComplete()
        emitter.onComplete()
        println("create-Looper:" + (Looper.getMainLooper() == Looper.myLooper()))
    }
}).subscribeOn(Schedulers.io())//被观察者执行在什么线程线程
    .observeOn(AndroidSchedulers.mainThread())//观察者执行在什么线程线程
    //建立订阅关系
    .subscribe(object : Observer<String> {
        override fun onSubscribe(d: Disposable) {
            println("onSubscribe-Looper:" + (Looper.getMainLooper() == Looper.myLooper()))
        }

        override fun onNext(s: String) {
            println("onNext$s")
        }

        override fun onError(e: Throwable) {
            println("onError")
        }

        override fun onComplete() {
            println("onComplete")
        }
})

Observable

Observable中文意思就是被观察者,通过create方法生成对象,里面放的参数ObservableOnSubscribe,可以理解为一个计划表,泛型T是要操作对象的类型,重写subscribe方法。然后在其中写准备完成的事情(任务),当你执行这些任务的时候,订阅了这个对象的观察者就会收到消息。
然后subscribe有一个传参,他有3个方法,分别是onNext();onError();onComplete();
其中onNext();可以无线调用,Observer都能收到。onComplete();可以多次调用,但Observer只接受一次;onError();只能调用一次,第二次将出现异常

Observer

通过new创建一个Observer并实现其中的方法:onNext();onError();onComplete();。看到这3个方法,就能猜到是做什么的了。
如上面所说,当Observable通过subscribe的传参执行onNext()等方法时,Observer的这些方法就会被执行。

这个关系就像音乐软件的歌手、音乐人,和关注他们的听众,当音乐人发布新歌时,听众就会收到通知。

Scheduler

RxJava是支持异步的,但要如何做到呢?这就需要讲到Scheduler,中文翻译过来就是调度器。
它是用来控制线程的,如果没有设置Scheduler,RxJava遵循哪个线程产生,就在哪个线程消费的原则,即观察者和消费者是在同一个线程。

如果需要前台调用,后台执行。那么就需要用到Scheduler了,
.observeOn(AndroidSchedulers.mainThread())表示观察者执行在什么线程
.subscribeOn(Schedulers.io())表示被观察者执行在什么线程线程

参考文章:https://www.jianshu.com/p/cd3557b1a474

深入参考文章:https://blog.csdn.net/yang_study_first/article/details/111085666

原文地址:https://www.cnblogs.com/VoidCom/p/17077119.html