码迷,mamicode.com
首页 > 编程语言 > 详细

RxJava--学了下RxJava

时间:2016-05-11 13:06:19      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

 

 

之前就知道有RxJava这玩意,知道这玩意很屌,不过也就止于看看标题,看几段介绍的程度(懒癌害人不浅)。
这周心血来潮,抽空把之前收藏的 扔物线 大神写的RxJava入门文章看了。

http://gank.io/post/560e15be2dca930e00da1083

花了一晚上看完,顺便做做笔记,然后试着把上传和压缩图片的逻辑改用RxJava实现。
发现真的用得很爽。屌爆了。整个流程一口气写完,不需要在Handler中跳来跳去,还自带线程调度,真棒。

技术分享

下面是乱写的笔记,有些是直接Ctrl+C,Ctrl+V的,记得乱七八糟,估计也就我自己清楚这笔记写的是什么鬼了(其实就是就为了水篇博客而已,手动滑稽)。

下载

https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid

写笔记时的最新版:
compile ‘io.reactivex:rxjava:1.0.14‘
compile ‘io.reactivex:rxandroid:1.0.1‘

理解

RxJava主要用到观察者模式,观察者被观察者通过订阅完成绑定。
在程序中,观察者无法或者不好去主动(即定时查询,这样比较浪费性能,而且不及时)去获取被观察者的状态。
一般是在被观察者发生事件时,再去通知观察者。虽然这和现实的情况有点区别。

用法

流程

->实现被观察者,绑定事件
—>实现观察者,定义事件的响应
—->观察者订阅事件(被观察者.subscribe(观察者))
——>被订阅者开始发送事件

API

Observable:被观察者

通过create()just()from()来绑定(输入)事件来构造被观察者对象
通过subscribe()观察者并联,并开始向观察者发送事件

通过map(),将输入的事件进行转换(加工)成另一个事件,返回结果给观察者响应

flatMap(),可以将输入的事件进行转换(加工)成其他事件(1转1,或者1转多),将新事件绑定到新的被观察者,构成新的被观察者对象,返回此新被观察者对象
(之后会由新被观察者发事件给观察者,所以subscribe()的时候,需要注意观察者响应的是事件类型,要跟新观察者一致)

lift()目标订阅者进行层层包装,通过Observable.Operator,让包装后的订阅者可以直接处理事件
compose()是对多个lift()的封装

throttleFirst() 在每次事件触发后的一定时间间隔内丢弃新的事件,用作防抖什么的,按一次后,多少时间内再按了也没用

Observer:观察者

主要响应事件
onNext()onCompleted()onError()
onCompleted()onError()互斥

Subscriber:实现了Observer的抽象类

  • onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
  • unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。

Action0Action1ActionXObserver的不完整版

Action0只响应一个事件,对应onCompleted()
Action1只响应一个事件,对应onNext()onCompleted(),还有其他Action2Action3

Observable.OnSubscribe:订阅

其实就是事件的抽象,事件会激发观察者,即调用观察者的响应回调

Scheduler:线程控制

1
2
3
4
5
6
7
8
Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // 新线程,由 observeOn() 指定
.observeOn(Schedulers.io())
.map(mapOperator2) // IO 线程,由 observeOn() 指定
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber); // Android 主线程,由 observeOn() 指定
  • Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 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(),它指定的操作将在 Android 主线程运行。
  • subscribeOn()指定订阅事件发生的线程(只生效一次,最先调用那次)
  • observeOn()指定观察者响应的线程,可调用(生效)多次
  • doOnSubscribe() doOnSubscribe()的后面跟一个 subscribeOn() ,就能指定准备工作的线程了。

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

1
2
3
4
5
6
7
8
9
10
11
Observable.create(onSubscribe)
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
progressBar.setVisibility(View.VISIBLE); // 需要在主线程执行
}
})
.subscribeOn(AndroidSchedulers.mainThread()) // 指定主线程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);

RxJava--学了下RxJava

标签:

原文地址:http://www.cnblogs.com/awkflf11/p/5481087.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!