什么是 rxJava?
RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
简单来说,rxJava 是一种 基于事件的,使用了可被观察序列 的异步 响应 扩展 的类库。
这句话有这几个意思:
rxJava 是解决 异步问题的。
rxJava 是基于事件机制的。
rxJava 是处理响应扩展的,解决 事件的响应问题(比如事件的响应在哪个线程?)。
rxJava 是序列的。它是个有顺序的队列,按顺序的,先进后出的。它对集合对象的支持很好。
rxJava 使用了 设计模式里的 观察者模式 来实现。
引用类库
compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1'
代码里如何使用
rxJava的代码长这样:
Observable.from(userBeans) .map(new Func1<UserBean, String>() { @Override public String call(UserBean userBean) { return String.format("%s(%s)", userBean.name, userBean.age); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String str) { alert(str); } });
这段代码告诉了我们:
Observable.from () 创建了一个被观察的对象。
.map() 方法执行了转换,将对象转成字符串
.subscribeOn() 指示了 在哪个线程里执行 上面的转换操作。
.observeOn() 指示了 在哪个线程里执行 对结果的响应操作,比如后面的 alert 方法。
.subscribe() 传递了具体的响应处理,即执行了 alert方法。
代码很优雅,链式的写法,很清晰的表达了代码的行为。
从单个对象创建被观察对象的演示
使用 just() 方法,指定单个对象来创建被观察对象实例。
private void doSomeOne() { Observable.just("Hello, world!").subscribe(new Action1<String>() { @Override public void call(String str) { alert(str); } }); }
从一个集合创建被观察对象的演示
使用 from() 方法,指定一个集合来创建被观察对象实例。
private void doSomeArray() { Observable.from(new String[]{"A", "B", "C"}).subscribe(new Action1<String>() { @Override public void call(String str) { alert(str); } }); }
对象转换的演示
我们使用 map() 方法进行转换。下面的代码演示了 从 UserBean数组创建被观察对象,然后使用map()方法转换成 字符串。
private void doSomeEntity() { UserBean[] userBeans = new UserBean[3]; userBeans[0] = new UserBean("jo", 18); userBeans[1] = new UserBean("ken", 9); userBeans[2] = new UserBean("hack", 30); //增加了map方法,转出 实体到字符串 Observable.from(userBeans).map(new Func1<UserBean, String>() { @Override public String call(UserBean userBean) { return String.format("%s(%s)", userBean.name, userBean.age); } }).subscribe(new Action1<String>() { @Override public void call(String str) { alert(str); } }); }
参考:
https://github.com/ReactiveX/RxJava
http://gank.io/post/560e15be2dca930e00da1083