RxJava 之Consumer和Action的使用

本文介绍RxJava中如何使用Consumer和Action简化观察者回调代码。通过不同subscribe方法的使用示例,展示了如何针对onNext、onError、onComplete等事件进行简洁有效的响应。

在之前的RxJava中已经讲到创建观察者的代码如下:

//创建观察者
Observer<String> observer = new Observer<String>(){

  @Override
  public void onSubscribe(Disposable d) {
      System.out.println("开始采用subscribe连接!");
  }

  @Override
  public void onNext(String value) {
      System.out.println("对Next事件作出响应:"+value);
  }

  @Override
  public void onError(Throwable e) {
      System.out.println("对Error事件作出响应!");
  }

  @Override
  public void onComplete() {
      System.out.println("事件执行完毕!");
  }
};
复制代码

代码中有四个回调方法,但是我们不一定会用到所有的回调方法,那么怎么才能让代码更加简洁呢?

这样我们就会用到Consumer和Action了。

以下是subscribe中可用参数的截图:

  • subscribe()

不带任何参数,也就是说观察者没有任何回调。

  • subscribe(Observer<? super T> observer)

将Observer作为参数,它有四个回调方法,文章开头就说明了

  • subscribe(Consumer<? super T> onNext)

将Consumer作为参数,Consumer中有个回调方法accept,accept带有一个参数,接受被观察者发射过来的数据

    Observable.create(new ObservableOnSubscribe<String>() {

        @Override
        public void subscribe(ObservableEmitter<String> emitter) {
            emitter.onNext("hello word A");
            emitter.onNext("hello word B");
            emitter.onNext("hello word C");
            emitter.onComplete();
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println(s);
        }
    });
复制代码

当被观察者发射onNext时,accept将被执行

  • subscribe(Consume<? super T> onNext, Consumer<? super Throwable> onError)

带有两个Consumer参数,分别负责onNextonError的回到

    Observable.create(new ObservableOnSubscribe<String>() {

        @Override
        public void subscribe(ObservableEmitter<String> emitter) {
            emitter.onNext("hello word A");
            emitter.onNext("hello word B");
            emitter.onNext("hello word C");
            emitter.onError(new Throwable("this is nullpointException"));
            emitter.onComplete();
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println(s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            System.out.println(throwable.getMessage());
        }
    });
复制代码

执行结果

hello word A
hello word B
hello word C
this is nullpointException复制代码
  • subscribe(Consume<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete)

带有三个参数,分别负责onNext、onError和onComplete的回调

    Observable.create(new ObservableOnSubscribe<String>() {

        @Override
        public void subscribe(ObservableEmitter<String> emitter) {
            emitter.onNext("hello word A");
            emitter.onNext("hello word B");
            emitter.onNext("hello word C");
            //emitter.onError(new Throwable("this is nullpointException"));
            emitter.onComplete();
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println(s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            System.out.println(throwable.getMessage());
        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("onComplete");
        }
    });
复制代码

执行效果

hello word A
hello word B
hello word C
onComplete复制代码
  • subscribe(Consume<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe)
    Observable.create(new ObservableOnSubscribe<String>() {

        @Override
        public void subscribe(ObservableEmitter<String> emitter) {
            emitter.onNext("hello word A");
            emitter.onNext("hello word B");
            emitter.onNext("hello word C");
            //emitter.onError(new Throwable("this is nullpointException"));
            emitter.onComplete();
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println(s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            System.out.println(throwable.getMessage());
        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("onComplete");
        }
    }, new Consumer<Disposable>() {
        @Override
        public void accept(Disposable disposable) throws Exception {
            System.out.println("观察者和被观察者已被连接,disposable可以立即中断连接!");
        }
    });
复制代码

执行效果:

System out: 观察者和被观察者已被连接,disposable可以立即中断连接!
hello word A
hello word B
hello word C
onComplete
复制代码

想要搞清楚Consumer和Action的用法,必须了解他们是什么东西?他们是干什么的

(1)他们是什么?

他们都是借口,源码如下:

public interface Consumer<T> {
    /**
     * Consume the given value.
     * @param t the value
     * @throws Exception on error
     */
    void accept(T t) throws Exception;
}
复制代码
public interface Action {
    /**
     * Runs the action and optionally throws a checked exception.
     * @throws Exception if the implementation wishes to throw a checked exception
     */
    void run() throws Exception;
}
复制代码

(2)他们是干什么的?

他们都是为了触发回调的,Consumer自带一个参数,Action不带餐宿。

当被观察者发射 onNext时,由于onNext带有参数,所以使用Consumer

当被观察者发送onComplete时,由于onComplete不带参数,所以使用Action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值