RxJava
为什么要使用RxJava
说到异步操作,我们会想到Android的AsyncTask和Handler。但是随着请求的数量越来越多,代码逻辑
将会变得越来越复杂而RxJava却仍旧能保持清晰的逻辑。RxJava的原理就是创建一个Observable对象来干
活,然后使用各种操作符建立起来的链式操作,就如同流水线一样,把你想要处理的数据一步一步地加工
成你想要的成品,然后发射给Subscriber处理。
创建操作符
- create
- just
- from
- interval(创建一个按固定时间间隔发射整数序列的Observable)
- range(创建发射指定范围的整数序列的Observable,可以拿来代替for循环,发射一个范围内的有序整数序列,第一个参数是起始值,并且不小于0;第二个参数为终值,左闭右开)
- repeat(创建一个N次重复发射特定数据的Observable)
变换操作符
- map(通过指定一个Func对象,将Observable转换为一个新的Observale对象并发射,观察者将收到信的Observable处理)
- flatMap(将Observable发射的数据集合变换为Observable集合,然后再将这些Observable发射的数据平坦化地放进一个单独的Observable。flatMap的合并允许交叉,也就是说可能会交错地发送事件,最终结果的顺序可能并不是原始Observable发送时的顺序)
- cast(强制将Observable发射的所有数据转换为指定类型)
- concatMap(与flatMap一致;不过,解决了后者交叉的问题)
- flatMapIterable(可以将数据包装成Iterable,Iterable接口 (java.lang.Iterable) 是Java集合的顶级接口之一。Collection接口继承Iterable,所以Collection的所有子类也实现了Iterable接口)
- buffer(将源Observable变换为一个新的Observable,这个新的Observable每次发射一组列表值而不是一个一个元素发射)
过滤操作符
- filter(对源Observable产生的结果自定义规则进行过滤,只有满足条件的才会提交给订阅者)
- elementAt(用来返回指定位置的数据)
- distinct(用来去重,其只允许还没有发射过的数据项通过)
- skip(将源Observable发射的数据过滤掉前N项)
- take(将源Observable发射的数据只取前N项)
- ignoreElements(忽略所有源Observable产生的结果,只把Observable的onCompleted和onError时间通知给订阅者)
- throttleFirst(定期发射这个时间段里源Observable发射的第一个数据,这个操作符默认在computation调度器上执行)
- throttleWithTimeOut(源Observable每次发射出来一个数据后,就会进行计时,如果在设定好的时间结束前,源Observable有新的数据发射出来,这个数据就会被丢弃)
组合操作符
可以同时处理多个Observable来创建我们所需要的Observable。
- startWith(会在源Observable发射的数据前面插上一些数据)
- merge(将多个Observable合并到一个Observable中进行发射,merge可能会让合并的Observable发射的数据交错)
- concat(与merge类似,只不过是按照严格的顺序发射,前一个Observable没发射完成,是不会发射后一个Observable数据的)
- zip(合并两个或者多个Observable发射出的数据项,根据指定的函数变换它们,并发射一个新值)
- combineLastest(讲的有些抽象,还没搞懂)
辅助操作符
- delay(让原始Observable在发射每项数据之前都暂停一段指定的时间段)
- Do(Do系列操作符就是为原始Observable的生命周期事件注册一个回调,当Observable的某个事件发生时就会调用这些回调)
- subscribeOn(用于指定Observable自身在哪个线程上运行)
- observeOn(用于指定Observer所运行的线程,也就是发射出的数据在哪个线程上使用)
- timeout(如果原始Observer过了指定的一段时长没有发射任何数据,timeout操作符会以一个onError通知终止这个Observer,或者继续执行一个备用的Observer)
错误处理操作符
- catch(拦截原始Observeble的onError通知,将它替换为其他数据项或数据序列,让产生的Observeble能够正常终止或者根本不终止)
- retry(不会将原始Observeble的onError通知传递给观察者,它会订阅这个Observeble,再给它一次机会无错误地完成其数据序列。retry总是传递onNext通知给观察者,由于重新订阅,这可能会造成数据项重复)
条件操作符和布尔操作符
可用于根据条件发射或变换Observer,或者对它们做布尔运算。
布尔操作符
- all(根据一个函数对源Observeble发射的所有数据进行判断,最终返回的结果就是这个判断结果。这个函数使用发射的数据作为参数,内部判断所有的数据是否满足我们定义好的判断条件。如果全部都满足则返回true,否则就返回false)
- contains
- isEmpty
条件操作符
- amb(对于给定两个或者多个Observeble,它只发射首先发射数据或通知的那个Observeble的所有数据)
- defaultIfEmpty(发射来自原始Observeble的数据。如果原始Observeble没有发射数据,就发射一个默认的数据)
转换操作符
将Observeble转换为另一个对象或数据结构
- toList
- toSortedList(对产生的列表排序,默认是自然升序。如果发射的数据项没有实现Comparable接口,会抛出一个异常。当然,若发射的数据项没有实现Comparable接口,可以使用toSortedList(Func2)变体,其传递的函数参数Func2会作用于比较两个数据项)
- toMap
线程控制
- Schedulers.immediate():在当前线程运行
- Schedulers.newThread()
- Schedulers.io()
- Schedulers.computation()
- Schedulers.trampoline()
- AndroidSchedulers.mainThread():RxAndroid库中提供,在主线程中运行