RxJava入门使用

269 阅读2分钟

一、如何使用RxJava

  1. 先创建Observables(被观察者),用来发送数据
  2. 通过Observable操作,将这些Observables转换成你想要的数据格式
  3. 然后观察者对于数据做成具体的反应,响应式编程
  4. 错误处理

二、创建Observables(被观察者)

  1. 创建数据流可以使用,just、range、create等,下面对一些重要的API做介绍
  2. 可参考:github.com/ReactiveX/R…

1、just

  1. 创建一个已经存在的数据,并且发送到下游去消费
  2. 支持1-9个参数
Observable.just("world")
        .doOnNext(v -> System.out.println(v))
        .subscribe(v -> System.out.println("hello " + v));

2、from

  1. 创建一系列的已经存在数据源,和just区别是它包含多个数据源
  2. from包含fromArray、fromIterator、fromCallable等
Observable.fromIterable(Lists.newArrayList(1, 2, 3))
            .subscribe(v -> System.out.println("hello " + v));
            
Observable.fromCallable(() -> "world").subscribe(System.out::println);

// 判断一个任务是否运行完
Completable.fromRunnable(() -> System.out.println("111"))
            .subscribe(() -> System.out.println("done"), error -> error.printStackTrace());

3、create

  1. 用户自定义一个函数用来创建运行的数据流,比如接受客户端请求,那么这个数据源就是源源不断的
  2. 通过emitter中的onNext将数据流向下游,onComplete表示数据已经发送完,onError表示当前发送数据有异常
  3. 这种要注意背压的场景
ObservableOnSubscribe handler = emitter -> {
    // onNext将数据发送到下游
    emitter.onNext("create");
    emitter.onNext("a source");
    // 表示数据发送完毕
    emitter.onComplete();
    // onError表示当前创建数据源发生异常
    // emitter.onError(new RuntimeException("error"));
};
// 通过handler创建数据流
// subscribe中第一个action是对上游的数据流进行处理,第二个action是对异常进行处理,第三个action是对数据发送完毕进行处理
Observable.create(handler).subscribe(System.out::println,
        error -> System.out.println("error:" + error), () -> System.out.println("done!"));

4、defer

  1. 创建一个callable去生成数据流Observable,当用户使用subscribe时才会真正调用
  2. 下面例子中最后打印的结果是不一样的,会相差一秒
Observable<Long> observable = Observable.defer(() -> {
    long time = System.currentTimeMillis();
    return Observable.just(time);
});

observable.subscribe(time -> System.out.println(time));

Thread.sleep(1000);

observable.subscribe(time -> System.out.println(time));

5、range

  1. 创建一系列的数值,range创建int,rangeLong创建long
String greeting = "Hello World!";

Observable<Integer> indexes = Observable.range(0, greeting.length());

Observable<Character> characters = indexes
    .map(index -> greeting.charAt(index));

characters.subscribe(character -> System.out.print(character), error -> error.printStackTrace(),
        () -> System.out.println());

6、interval

  1. 和定时任务类似,隔一定的生命周期执行,返回从0开始的long,每执行一次+1
// 每隔1s执行一次
Observable.interval(1, TimeUnit.SECONDS).subscribe(time -> {
    System.out.println(System.currentTimeMillis());
    if (time % 2 == 0) {
        System.out.println("Tick");
    } else {
        System.out.println("Tock");
    }
});

Thread.sleep(2000);

7、timer

  1. 和interval类似,只是执行一次
Observable<Long> eggTimer = Observable.timer(5, TimeUnit.MINUTES);

eggTimer.blockingSubscribe(v -> System.out.println("Egg is ready!"));

三、操作转换Observables

  1. 操作类似与skip、take、merge、map、flatMap等
  2. 参考:github.com/ReactiveX/R…
// 取11-15
Observable.range(1, 50)
        .skip(10) // 先跳过10个
        .take(5) // 再取前5个
        .subscribe(System.out::println);

四、错误处理

  1. 就是对error处理的逻辑,引用上面的案例
  2. 具体错误处理API参考:
ObservableOnSubscribe handler = emitter -> {
    emitter.onNext("create");
    emitter.onNext("a source");
    emitter.onComplete();
    // onError表示当前创建数据源发生异常
    emitter.onError(new RuntimeException("error"));
};
// 通过handler创建数据流
// subscribe中第二个action是对异常进行处理
Observable.create(handler).subscribe(System.out::println,
        error -> System.out.println("error:" + error), () -> System.out.println("done!"));