深入浅出RxJava—基础篇

来源:互联网 发布:唐宣宗 知乎 编辑:程序博客网 时间:2024/05/15 08:09

原文链接

参考文章


在项目gradle中引入 
  1. compile 'io.reactivex:rxjava:1.1.0'
  2. compile 'io.reactivex:rxandroid:1.1.0'
基础
  1. Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
  2. @Override
  3. public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello RXJava");
  4. subscriber.onCompleted(); }
  5. });
  6. Subscriber<String> subscriber = new Subscriber<String>() {
  7. @Override
  8. public void onCompleted() {
  9. Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_LONG).show(); }
  10. @Override
  11. public void onError(Throwable e) {
  12. }
  13. @Override
  14. public void onNext(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); }
  15. };
  16. observable.subscribe(subscriber);
这个是最basic的写法,定义一个发布者和订阅者,通过observable.subscribe(subscriber)  将两者关联起来,observable 将会调用subscriber 的onNext方法和onCompleted方法。
显然为了打印一句"Hello RXJava" 要写这么多繁琐的代码,如何更加简洁的书写逻辑呢? RxJava提供了很多函数供我们使用。 
  1. Observable<String> just = Observable.just("你好");
  2. Action1<String> action1 = new Action1<String>() {
  3. @Override
  4. public void call(String s) {
  5. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  6. }
  7. };
  8. just.subscribe(action1);

如上,Observable.just 函数就是用来创建只发送一个事件就结束的Observable 对象的,subscriber  只关心onNext 方法其他两个方法不关心,所以我们可以使用newAction1 这个类。最后通过just.subscribe(action1)将两者关联起来。以上代码还可以更简写:
  1. Observable.just("你好").subscribe(new Action1<String>() {
  2. @Override
  3. public void call(String s) {
  4. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  5. }
  6. });
变换/操作符
如果现在想在"你好" 后面加签名要怎么做呢? 你可能说直接加上,这样 "你好,win" 但是这样真的可以吗? 假如有多个订阅者呢?显然这猴子那个方式不可行。直接这样Toast.makeText(MainActivity.this, s+"win",Toast.LENGTH_LONG).show(); 直接加载订阅者的处理逻辑里,这样的话,是可以的,但是这样写代码是不是很累赘呢?一点都不轻量级。如果能在中间的某个步骤进行变换,岂不是最好。那么操作符应运而生。操作符就是解决Observable 对象变换的问题的。且RxJava提供了很多操作符。

map:就是把一个事件转换为另一个事件,操作符就是用于变换Observable 对象的,它返回一个Observable 对象,这样可以实现链式调用,在一个Observable 上多次使用map操作符,将对简单的数据传递给subscriber 。
  1. Observable.just("你好").map(new Func1<String, String>() { //入参是字符串,出参也是字符串
  2. @Override
  3. public String call(String s) {
  4. return s + "+ win";
  5. }
  6. }).subscribe(new Action1<String>() {
  7. @Override
  8. public void call(String s) {
  9. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  10. }
  11. });

 对象返回的类型,可以通过map操作符返回一个新的数据类型的
  1. Observable.just("map 练习").map(new Func1<String, Integer>() {
  2. @Override
  3. public Integer call(String s) {
  4. return s.hashCode();
  5. }
  6. }).subscribe(new Action1<Integer>() {
  7. @Override
  8. public void call(Integer Integer) {
  9. Toast.makeText(MainActivity.this, String.valueOf(Integer), Toast.LENGTH_LONG).show();
  10. }
  11. });
之前我们说了map变换将最简单的数据传递给subscriber ,所以还可以这么写
  1. Observable.just("map 练习").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 String.valueOf(integer);
  10. }
  11. }).subscribe(new Action1<String>() {
  12. @Override
  13. public void call(String s) {
  14. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  15. }
  16. });

总结
1.Observable subscriber可以做任何事情
Observable 可以是一个数据库查询,subscriber用来显示查询结果;Observable 可以是屏幕上的点击事件,subscriber用来响应点击事件;Observable 可以是一个网络请求,subscriber用来显示请求结果

2.Observable subscriber是独立于中间的变换过程的。
Observable subscriber中间可以增减任何数量的map。整个系统是高度可组合的,操作数据是一个很简单的过程。



原创粉丝点击