RxJava
2016/2/19 15:03:53
看了大头鬼翻译的rxJava。这里写写我认为重要的点。
核心思想
RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据。。。)
一个observable 可以发出0个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束
各位看官看到这是不是说这就是观察者模式思想。但是这和真正的观察者有点区别:如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会发出任何事件的。
observable的创建。
- 简单构建Observable.create(OnSubscribe f);
RxJava内置了很多简化创建Observable对象的函数
Observable.just()就是用来创建只发出一个事件就结束的Observable对象
Observable.from() 方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber
操作符(Operators)解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件
(一些基本的操作符:)
map操作符:
Observable map(Func1 < ? super T, ? extends R> func)我们最初希望Subscriber 收到的类型是 T 类型的。但是经过 map 的转换,Subscriber 收到的是 R类型的数据
Observable.just("Hello, world!") .map(new Func1<String, String>() { @Override public String call(String s) { return s + " ---"; } }) .subscribe(s -> System.out.println(s));
flatMap操作符:
Observable flatMap(Func1< ? super T, ? extends Observable< ? extends R>> func) 接收一个 Observable 的输出作为输入,同时输出另外一个Observable
``` query("Hello, world!") .flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> urls) { return Observable.from(urls); } }) .subscribe(url -> System.out.println(url)); ```
filter操作符:
Observable< T > filter ( Func1<?super T, Boolean> predicate )添加过滤条件。take操作符
输出最多指定数量的结果
Observable take(final int count)
Observable take(long time, TimeUnit unit)
Observable take(long time, TimeUnit unit, Scheduler scheduler)
注意:(来自大头鬼)
1.Observable和Subscriber可以做任何事情
Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。
2.Observable和Subscriber是独立于中间的变换过程的。
在Observable和Subscriber中间可以增减任何数量的map。整个系统是高度可组合的,操作数据是一个很简单的过程。
错误处理
Subscriber 对象需要实现三个方法。onNext(T t) , onCompleted() , onError(Throwable e)
- 只要有异常发生onError()一定会被调用,在这里可以做一下异常处理。
- 操作符不需要处理异常,bserverable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。
- 你能够知道什么时候订阅者已经接收了全部的数据 onCompleted()。
调度器
Android的一些耗时操作需要再子线程进行。否则会产生ANR。所以我们使用subscribeOn()指定观察者代码运行的线程,使用 observerOn()指定订阅者运行的线程
- subscribeOn 指定Schedulers四个线程模式 :Schedulers.newThread() 新线程 Schedulers.computation() 计算线程
Schedulers.io() IO线程 - observerOn() 可以把运行的结果发送回到指定线程,比如是AndroidSchedulers.mainThread()