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

最新文章

  1. Openvpn 撤销签署的证书(删除用户)
  2. 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)
  3. 基础知识系列☞各版本下IIS请求处理过程区别
  4. Func系列1:安装配置
  5. VMware 命令行下的网络配置
  6. 【HDOJ】2585 Hotel
  7. STM8S EEPROM 操作
  8. ubuntu 14.04中Elasticsearch 2.3 中 Nginx 权限认证
  9. 新人小达之wpf
  10. 第 10 章 MySQL Server 性能优化
  11. Delphi编程之爬取贴吧多页帖子图片
  12. canvas-a13prototype.html
  13. SpringBoot使用缓存
  14. 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)
  15. tomat修改启动路径
  16. PyQt5--MenuBar
  17. JavaScript学习笔记——错误处理
  18. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
  19. docker存储volume
  20. SQL自定义排序 ORDER BY

热门文章

  1. Joplin修改笔记存储位置
  2. DLL的两种加载方式
  3. 3DText无法被物体遮挡 - 解决
  4. 浅谈浏览器端 WebGIS 开发可能会用到的、提升效率的 js 库
  5. Nacos配置中心 (介绍与配置)
  6. .NET List集合对比差异,Get,Post请求
  7. Destroying Roads
  8. Activiti-25张表对应的关系以及常用接口
  9. DomDom
  10. ASAS-CoMoSpA研究: 评价SpA不同分类标准的表现