学习 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方法会被调用,事件序列就会依次触发

 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);
View Code

 

感觉例子很麻烦,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         });

 

posted @ 2016-07-26 23:10  demon9  阅读(201)  评论(0编辑  收藏  举报