学习 RxJava <一>
ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
https://github.com/ReactiveX/RxJava
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
RxJava 的优势是简洁,和AsyncTask、Handler不同,RxJava 随着程序逻辑变得越来越复杂,依然能够保持简洁。
RxJava 使用的是 观察者模式:Observable (被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。
观察者 和 被观察者 通过 subscribe() 方法实现订阅关系,也可以解除订阅
回调方法除了普通事件 onNext 还有额外两种
onCompleted 当没有 新的onNext 发出,这个方法会被调用
onError 事件处理中出现异常就出调用,同时不会再有新的事件发出
上个简单例子
这里 观察者 stringSubscriber 在事件被触发的时候 得到 string 并 把值设置给textview , 被观察者 stringObservable 没有做什么复杂操作 就是string ,当 被观察者 被订阅的时候 它的call方法会被调用,事件序列就会依次触发
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 rx.Observable<String>stringObservable= rx.Observable.create(new rx.Observable.OnSubscribe<String>() { 2 @Override 3 public void call(Subscriber<? super String> subscriber) { 4 subscriber.onNext("hello rx"); 5 subscriber.onCompleted(); 6 } 7 }); 8 9 10 Subscriber<String>stringSubscriber=new Subscriber<String>() { 11 @Override 12 public void onCompleted() { 13 14 } 15 16 @Override 17 public void onError(Throwable throwable) { 18 19 } 20 21 @Override 22 public void onNext(String s) { 23 textView.setText(s); 24 } 25 }; 26 27 stringObservable.subscribe(stringSubscriber);
感觉例子很麻烦,RxJava 也提供了一些快捷方法,再来一个例子
这个例子中 log会依次打印 hello rx 2
just方法 把传入的参数 依次发送出来 ,onNext("hello"); onNext("rx 2"); onCompleted(); 还有from方法 from(T[ ]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来
我们对观察者的 OnComplete和OnError 方法暂时不关心,只需要在onNext方法中做处理的时候 就可以用Action1
1 rx.Observable<String> stringObservable2 =rx.Observable.just("hello", "rx 2"); 2 3 Action1<String>stringAction1=new Action1<String>() { 4 @Override 5 public void call(String s) { 6 log.e(s); 7 } 8 }; 9 10 stringObservable2.subscribe(stringAction1);
订阅方法subscribe 有一个重载版本 Observable.subscribe(onNextAction, onErrorAction, onCompleteAction);
上面的例子 我们没有去关心 OnComplete和OnError ,说明 可以只需要第一个参数 Observable.subscribe(onNextAction); 所以还能精简代码
1 rx.Observable.just("hello rx 3").subscribe(new Action1<String>() { 2 @Override 3 public void call(String s) { 4 textView3.setText(s); 5 } 6 });
有时 我们需要对 结果 进行加工处理,比如 一个string 转化成 bitmap
RxJava 为我们提供了 操作符Operators 对事件序列进行变换的支持,这是它的核心功能之一 。 将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列 让我们能对结果进行变换而非简单的修改
举个简单 例子
这里用 Func1
方法 将原来的 string 加工了一下 返回了一个新的 string
1 rx.Observable.just("hello rx 4").map(new Func1<String, String>() { 2 @Override 3 public String call(String s) { 4 return s+" Operators"; 5 } 6 }).subscribe(new Action1<String>() { 7 @Override 8 public void call(String s) { 9 Toast.makeText(RxActivity.this,s,Toast.LENGTH_SHORT).show(); 10 } 11 });
不止一次 可以进行多次操作 再来一个例子
第一个func1 把 string 转化成了 Integer
第二个func1 又把 Integer 转化成了 string
1 rx.Observable.just("rx5!").map(new Func1<String, Integer>() { 2 @Override 3 public Integer call(String s) { 4 return s.hashCode(); 5 } 6 }).map(new Func1<Integer, String>() { 7 @Override 8 public String call(Integer integer) { 9 return integer+" ! "+"two map rx5"; 10 } 11 }).subscribe(new Action1<String>() { 12 @Override 13 public void call(String s) { 14 textView5.setText(s); 15 } 16 });