RxJava使用入门

一、基本概念
Observable: 发射源,在观察者模式中成为“被观察者”
Observer: 接收源,“观察者”可接收Observable Subject发射的数据
Subject:Subject是一个比较特殊的对象,既可以是发射源也可以是接收源
Subscriber:“订阅者”,实现了Observer接口,比Observer多了一个最重要的方法unsubscribe();用于取消订阅,建议使用Subscriber作为接受者
Subscription:Observable调用subscribe()方法返回的对象,同样可以取消订阅。
Action0:RxJava中的一个接口,它只有一个无参call()方法,且无返回值,同样还有Action1、….Action9等,Action1封装了含有一个参数的call()方法,call(T t),以此类推;
Func0:与Action0类似,也有call()方法,但有返回值

二、使用过程简介:
创建一个数据发射源,用于发射数据:

Observable<String> sender = Observable.create(new Observable.OnSubscrible<String>(){
    @Override
    public void call(Subscriber<? super String> subscriber){
        subscriber.onNext("hello world")
    }
})

创建一个数据接收源

Observer<String> receiver = new Observer<String>() {

            @Override
            public void onCompleted() {

                //数据接收完成时调用
            }

            @Override
            public void onError(Throwable e) {

                //发生错误调用
            }

            @Override
            public void onNext(String s) {

               //正常接收数据调用
                System.out.print(s);  //将接收到来自sender的问候"Hi,Weavey!"
            }
        };

然后通过sender.subscriber(receiver) 把被观察者和观察者关联起来,send发射“hello world”将会被reveiver接收到,这是最简单的使用过程,Rxjava让异步,观察者模式变得简单起来

三、Rxjava在项目中的使用
Observable的创建:
1、使用create():

normalObserable = Observable.create(new Observable.OnSubcribe<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 = Observabel.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,它在一个给定的延迟后发射一个特殊的值,等同于handler.postDelay();

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

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

repeatObservable = Observable.just("repeatObservable").repeat(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);
  }};

有了Observable和Observer,就好办了,任取一个已创建的Observable和Observer关联上,即形成一个RxJava的例子

justObservable.subscribe(mObserver);

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

justObservable.subscribe(new Action1<String>(){
@Override
    public void call(String s) {

          LogUtil.log(s);
    }})

以上就是RxJava的简单用法,RxJava之所以受用户喜爱,是因为随着逻辑的复杂,需求的更改,代码依然可以保持极强的阅读性。

可以使用filter添加限制条件
   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) {
              //拿到谜之小明的数据
          }
      });
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不羁的闰土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值