RxJava
2016-04-05 13:53
826 查看
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()
相关文章推荐
- 解决Eclipse中SVN乱码问题
- Eclipse 出现Access restriction(访问jar包限制)错误
- Java并发编程系列之十六:Lock锁
- Java Date日期比较
- java日志--Log4j
- [转]Eclipse SVN冲突解决
- JAVA的锁总结
- Java多态细节与instanceof关键字
- java 枚举类循环
- java 爬n阶楼梯问题
- JDK7新特性
- jvm java虚拟机 新生代的配置
- Spring- Resource ——跟我学spring3
- java集合框架概述
- JAVA中ThreadLocal用法介绍
- Java_反射机制
- Java NIO系列教程(二) Channel
- Java NIO系列教程(一) Java NIO 概述
- Java NIO 教程
- javap(反编译)