RxJava 和 RxJava2

介绍

RxJava 是一款基于观察者模式和链式编程的异步和事件驱动的编程库。它允许开发者以响应式的方式处理异步事件流,使得代码更加简洁和易于维护。RxJava2 是 RxJava 的升级版,它在性能和功能上进行了一些改进和优化。

本文将介绍 RxJava 和 RxJava2 的基本概念和用法,并通过代码示例来演示其使用。

RxJava基本概念

在 RxJava 中,主要有以下几个基本概念:

  • Observable(被观察者):表示一个可以被观察的事件源,它可以发出多个事件。
  • Observer(观察者):用于订阅 Observable,并接收其发出的事件。
  • Subscription(订阅):表示 Observable 和 Observer 之间的关联关系,可以用于取消订阅。
  • Operator(操作符):用于对 Observable 发出的事件进行转换、过滤、组合等操作。
  • Scheduler(调度器):用于指定 Observable 和 Observer 执行的线程。

RxJava2基本概念

RxJava2 保持了和 RxJava 相同的基本概念,但在类和方法的命名上有所改变。RxJava2 中的核心类包括 Flowable、Disposable 和 Scheduler。

  • Flowable(被观察者):是 RxJava2 中新增的类,用于支持背压(Backpressure)。
  • Disposable(订阅):替代了 RxJava 中的 Subscription,用于取消订阅。
  • Scheduler(调度器):和 RxJava 中的 Scheduler 功能相同。

示例代码

下面是一个使用 RxJava 的代码示例,该示例展示了如何从一个 Observable 中发出多个事件,并通过操作符对事件进行过滤:

Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        for (int i = 0; i < 10; i++) {
            subscriber.onNext(i);
        }
        subscriber.onCompleted();
    }
})
.filter(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer integer) {
        return integer % 2 == 0; // 过滤掉奇数
    }
})
.subscribe(new Observer<Integer>() {
    @Override
    public void onNext(Integer integer) {
        System.out.println(integer);
    }
    
    @Override
    public void onCompleted() {
        System.out.println("Completed");
    }
    
    @Override
    public void onError(Throwable e) {
        System.out.println("Error: " + e.getMessage());
    }
});

上述代码中,我们首先创建了一个 Observable 对象,该对象会发出数字 0 到 9 的事件。然后,我们使用 filter 操作符过滤掉奇数,并通过 subscribe 方法订阅该 Observable,接收事件并打印到控制台。

下面是同样功能的 RxJava2 代码示例:

Flowable<Integer> flowable = Flowable.range(0, 10)
    .filter(new Predicate<Integer>() {
        @Override
        public boolean test(Integer integer) throws Exception {
            return integer % 2 == 0; // 过滤掉奇数
        }
    });

flowable.subscribe(new Subscriber<Integer>() {
    @Override
    public void onSubscribe(Subscription s) {
        s.request(Long.MAX_VALUE);
    }

    @Override
    public void onNext(Integer integer) {
        System.out.println(integer);
    }

    @Override
    public void onError(Throwable t) {
        System.out.println("Error: " + t.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("Completed");
    }
});

以上代码中,我们使用 Flowable.range 方法创建了一个 Flowable 对象,该对象会发出数字 0 到 9 的事件。然后,我们使用 filter 操作符过滤掉奇数,并通过 subscribe 方法订阅该 Flowable,接收事件并打印到控制台。

类图

classDiagram
    class Observable
    class Observer
    class Subscription
    class Operator
    class Scheduler
    
    Observable --|> Observer
    Observable --|> Subscription
    Observable --|> Operator
    Operator --|> Observer
    Observer --|> Subscription
    Scheduler --|> Observer
    Scheduler --|> Subscription