一、如何使用RxJava
- 先创建Observables(被观察者),用来发送数据
- 通过Observable操作,将这些Observables转换成你想要的数据格式
- 然后观察者对于数据做成具体的反应,响应式编程
- 错误处理
二、创建Observables(被观察者)
- 创建数据流可以使用,just、range、create等,下面对一些重要的API做介绍
- 可参考:github.com/ReactiveX/R…
1、just
- 创建一个已经存在的数据,并且发送到下游去消费
- 支持1-9个参数
Observable.just("world")
.doOnNext(v -> System.out.println(v))
.subscribe(v -> System.out.println("hello " + v));
2、from
- 创建一系列的已经存在数据源,和just区别是它包含多个数据源
- 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
- 用户自定义一个函数用来创建运行的数据流,比如接受客户端请求,那么这个数据源就是源源不断的
- 通过emitter中的onNext将数据流向下游,onComplete表示数据已经发送完,onError表示当前发送数据有异常
- 这种要注意背压的场景
ObservableOnSubscribe handler = emitter -> {
emitter.onNext("create");
emitter.onNext("a source");
emitter.onComplete();
};
Observable.create(handler).subscribe(System.out::println,
error -> System.out.println("error:" + error), () -> System.out.println("done!"));
4、defer
- 创建一个callable去生成数据流Observable,当用户使用subscribe时才会真正调用
- 下面例子中最后打印的结果是不一样的,会相差一秒
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
- 创建一系列的数值,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
- 和定时任务类似,隔一定的生命周期执行,返回从0开始的long,每执行一次+1
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
- 和interval类似,只是执行一次
Observable<Long> eggTimer = Observable.timer(5, TimeUnit.MINUTES)
eggTimer.blockingSubscribe(v -> System.out.println("Egg is ready!"))
三、操作转换Observables
- 操作类似与skip、take、merge、map、flatMap等
- 参考:github.com/ReactiveX/R…
Observable.range(1, 50)
.skip(10)
.take(5)
.subscribe(System.out::println);
四、错误处理
- 就是对error处理的逻辑,引用上面的案例
- 具体错误处理API参考:
ObservableOnSubscribe handler = emitter -> {
emitter.onNext("create");
emitter.onNext("a source");
emitter.onComplete();
emitter.onError(new RuntimeException("error"));
};
Observable.create(handler).subscribe(System.out::println,
error -> System.out.println("error:" + error), () -> System.out.println("done!"));