RxJava笔记

来源:互联网 发布:电大和网络教育的区别 编辑:程序博客网 时间:2024/06/06 01:01

RxJava的流行就不多说了,作为程序员的我,碰到流行的架子,当然是比较欣喜,比较好奇,我看一下RxJava响应式编程有哪些特性,学习学习!

  • 记住一点:

让复杂的程序逻辑回归简单 清晰


  • 源码地址

    https://github.com/ReactiveX/RxJava

RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库!
It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.
她继承了观察者模式的特性,去支持数据/事件序列,增加了操作符,当关心那些低级线程同步,线程安全和并发数据结构类的纠结问题时,Rx允许你把这些问题组合成一个序列!
Zero Dependencies
< 1MB Jar
Java 6+ & Android 2.3+
Java 8 lambda support
Polyglot (Scala, Groovy, Clojure and Kotlin)
Non-opinionated about source of concurrency (threads, pools, event loops, fibers, actors, etc)
Async or synchronous execution
Virtual time and schedulers for parameterized concurrency

如果第一次听这些什么序列,什么事件驱动,确实一脸懵逼,暂时过吧~

对比其他技术为什么要选择RxJava


  • Obervable(被观察者) 和 Subscriber(订阅者) 可以做任何事情

    • Observable可以是一个网络请求,Subscriber来显示请求结果;
    • Observable可以是一个数据库查询,Subscriber来显示查询结果;
    • Observable可以是按钮点击事件,Subscriber来响应点击事件;
    • Observable可以是大图片文件的加载解析,Subscriber来展示解析后的图片;

RxJava的相关API

  • Observable 可观察者/被观察者 { 事件 }

  • Observer/Subscriber(观察者/订阅者) { 消费事件 }

  • 操作符(Operators) (常用的)

    • map 转换对象
    • flatMap 平铺对象
    • disinct 去重复(独特的)
    • take 从开始取出固定个数
    • doOnNext 输出元素之前的额外操作
    • toList 打包对象为集合
  • Scheduler 调度器,用于线程控制

    • Schedulers.immdeiate() > 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
    • Schedulers.newThread() > 每次都创建新的线程执行
    • Schedulers.io() > I/O流操作(文件、数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
    • Schedulers.computation() > 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
    • AndroidSchedulers.mainThread() > UI主线程{Android专有的}

有了可调度线程,那谁来控制线程调度呢?
* subscribeOn可执行多次,切换操作符的线程
* observerOn 只需要执行一次,指定订阅者执行的线程(事件消费的线程,这样应该更专业)

使用

Subscriber 的 onStart() 可以用作流程开始前的初始化。

但onStart() 由于在 subscribe() 发生时就被调用了,因此不能指定线程,而是只能执行在 subscribe() 被调用时的线程。这就导致如果 onStart() 中含有对线程有要求的代码(例如在界面上显示一个 ProgressBar,这必须在主线程执行)将会有线程非法的风险,因为有时你无法预测 subscribe() 将会在什么线程执行。

而与Subscriber.onStart()相对应的有一个方法 Observable.doOnSubscribe() 。它和 Subscriber.onStart() 同样是在 subscribe() 调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。

1 0
原创粉丝点击