RxJava零基础入门(一)

89 阅读5分钟

normalObservable = Observable.create(new Observable.OnSubscribe<String>() {

  @Override

  public void call(Subscriber<? super String> subscriber) {

      subscriber.onNext("create1"); //发射一个"create1"的String

      subscriber.onNext("create2"); //发射一个"create2"的String

      subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方法

  }});

2.使用just( ),将为你创建一个Observable并自动为你调用onNext( )发射数据:


justObservable = Observable.just("just1","just2");//依次发送"just1"和"just2"

3.使用from( ),遍历集合,发送每个item:


List<String> list = new ArrayList<>();

list.add("from1");

list.add("from2");

list.add("from3");

fromObservable = Observable.from(list);  //遍历list 每次发送一个

/** 注意,just()方法也可以传list,但是发送的是整个list对象,而from()发送的是list的一个item** /

4.使用defer( ),有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable:


deferObservable = Observable.defer(new Func0<Observable<String>>() {

  @Override

  //注意此处的call方法没有Subscriber参数

  public Observable<String> call() {

      return Observable.just("deferObservable");

  }});

5.使用interval( ),创建一个按固定时间间隔发射整数序列的Observable,可用作定时器:


intervalObservable = Observable.interval(1, TimeUnit.SECONDS);//每隔一秒发送一次



6.使用range( ),创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异常:


rangeObservable = Observable.range(10, 5);//将发送整数10,11,12,13,14

7.使用timer( ),创建一个Observable,它在一个给定的延迟后发射一个特殊的值,等同于Android中Handler的postDelay( )方法:


timeObservable = Observable.timer(3, TimeUnit.SECONDS);  //3秒后发射一个值

8.使用repeat( ),创建一个重复发射特定数据的Observable:


repeatObservable = Observable.just("repeatObservable").repeat(3);//重复发射3次

Observer的创建


mObserver = new Observer<String>() {

  @Override

  public void onCompleted() {

      LogUtil.log("onCompleted");

  }

  @Override

  public void onError(Throwable e) {

  }

  @Override

  public void onNext(String s) {

      LogUtil.log(s);

  }};

ok,有了Observable和Obsever,我们就可以随便玩了,任取一个已创建的Observable和Observer关联上,即形成一个RxJava的例子,如:


justObservable.subscribe(mObserver);

mObserver的onNext方法将会依次收到来自justObservable的数据”just1”、”just2”,另外,如果你不在意数据是否接收完或者是否出现错误,即不需要Observer的onCompleted()和onError()方法,可使用Action1,subscribe()支持将Action1作为参数传入,RxJava将会调用它的call方法来接收数据,代码如下:


justObservable.subscribe(new Action1<String>() {

    @Override

    public void call(String s) {



          LogUtil.log(s);

     }});

以上就是RxJava最简单的用法。看到这里,我也不知道我写的是否简单明了,也许你会想,“哎呀,写个异步的东西,怎么这么麻烦,为什么不用Thread+Handler呢”,那你就错了,RxJava也以代码的简洁深受广大用户喜爱,简洁不能理解为代码量少,而是随着逻辑的复杂,需求的更改,代码可依然能保持极强的阅读性,举个简单的例子(前方高能预警~~~),领导要我从数据库的用户表查找出所有用户数据,我二话不说拿出心仪的RxJava就写:


Observable.create(new Observable.OnSubscribe<List<User>>() {

          @Override

          public void call(Subscriber<? super List<User>> subscriber) {

              List<User> userList = null;

              ···

              //从数据库获取用户表数据并赋给userList

              ···

              subscriber.onNext(userList);

          }

      }).subscribe(new Action1<List<User>>() {

          @Override

          public void call(List<User> users) {



              //获取到用户信息列表

          }

      });

但是,领导突然又不想要所有用户了,只要名字叫“小明”的用户,行吧,领导最大,我改(假设名字唯一):


Observable.create(new Observable.OnSubscribe<List<User>>() {

          @Override

          public void call(Subscriber<? super List<User>> subscriber) {

              List<User> userList = null;

              ···

              //从数据库获取用户表数据并赋给userList

              ···

              subscriber.onNext(userList);

          }

      }).flatMap(new Func1<List<User>, Observable<User>>() {

          @Override

          public Observable<User> call(List<User> users) {

              return Observable.from(users);

          }

      }).filter(new Func1<User, Boolean>() {

          @Override

          public Boolean call(User user) {

              return user.getName().equals("小明");

          }

      }).subscribe(new Action1<User>() {

          @Override

          public void call(User user) {

              //拿到谜之小明的数据

          }

      });

搞定,这时候领导又说,我不要小明了,我要小明的爸爸的数据,(坑爹啊~~),我继续改:


Observable.create(new Observable.OnSubscribe<List<User>>() {

          @Override

          public void call(Subscriber<? super List<User>> subscriber) {

              List<User> userList = null;

              ···

              //从数据库获取用户表数据并赋给userList

              ···

              subscriber.onNext(userList);

          } 

     }).flatMap(new Func1<List<User>, Observable<User>>() {

          @Override

          public Observable<User> call(List<User> users) {

              return Observable.from(users);

          }

      }).filter(new Func1<User, Boolean>() {

          @Override

          public Boolean call(User user) {

              return user.getName().equals("小明");

          }

      }).map(new Func1<User, User>() {

          @Override

          public User call(User user) { 

              //根据小明的数据user从数据库查找出小明的父亲user2

              return user2;

          }

      }).subscribe(new Action1<User>() {

          @Override

          public void call(User user2) {

            //拿到谜之小明的爸爸的数据

          }

      });

搞定,“还想怎么改?领导请说···”。

以上例子,涉及到几个操作符,初学者可能无法理解,但是无所谓,这不是重点,我的目的只是为了向你展示RxJava在需求不断变更、逻辑愈加复杂的情况下,依旧可以保持代码简洁、可阅读性强的一面,没有各种回调,也没有谜之缩进!

总结

看了以上所讲,如果你已经爱上了RxJava,如果你已经全部理解,我确信,你已经跨入RxJava的大门,剩下的只是时间的问题以及如何在实际开发场景中去应用的问题,那么下篇文章,我将继续讲解RxJava中各种强大的操作符,并尽量以实际开发过程中遇到的问题作为例子,提升自己的同时,帮助初学者迅速上手RxJava,如有写的不好的地方,还请见谅,真心欢迎各路大神指点,探讨相关技术。

RxJava 1.x.x 详细介绍的中文文档

注(添加于2017-08)

这里给出两篇基于RxJava2.x的好文章地址,感兴趣的可以去看看,也不错。

1、这可能是最好的RxJava 2.x 教程(完结版)

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

  • Android进阶高级工程师学习全套手册

  • 对标Android阿里P7,年薪50w+学习视频

  • 大厂内部Android高频面试题,以及面试经历