上篇文章《RxJava从入门到不离不弃(一)——基本概念和使用》,介绍了RxJava的概念和优点,也详细介绍了Observer、Observable和Subscriber等常见概念,相信大家对RxJava已经有了基本的认识。
上篇文章中的示例大家可能会觉得,打印字符串需要那么麻烦嘛?主要是为了展示RxJava的原理而采用了这种比较啰嗦的写法,RxJava其实提供了很多便捷的函数来帮助我们减少代码。今天一起来认识一下:
Observable简化
先看下Observable的原始写法:
Observable observer = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
subscriber.onNext("create1"); //发射一个"create1"的String
subscriber.onNext("create2"); //发射一个"create2"的String
subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方法
}
});
Observable的创建使用Observable.create方法,传入OnSubscribe对象,OnSubscribe相当于一个“计划表”,call参数subscriber制定计划,onNext表示执行,onCompleted表示任务结束,onError表示出错。
再来看看如何简化Observable对象的创建过程。RxJava内置了很多简化创建Observable对象的函数,比如Observable.just就是用来创建只发出一个事件就结束的Observable对象,创建Observable对象可以这样写:
just
使用just( ),将为你创建一个Observable并自动为你调用onNext( )发射数据。
Observable observable = Observable.just(1, 2.3, 4, "js");
from
使用from( ),遍历集合,发送每个item。
注意:just()方法也可以传list,但是发送的是整个list对象,而from()发送的是list的一个item
List list = new ArrayList<>();
list.add("from1");
list.add("from2");
list.add("from3");
Observable observable = Observable.from(list);
interval
使用interval( ),创建一个按固定时间间隔发射整数序列的Observable,可用作定时器。
第一个参数为 时间间隔大小
第二个参数为 时间间隔单位
Observable observable = Observable.interval(1, TimeUnit.SECONDS);
defer
使用defer( ),有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable
//注意此处的call方法没有Subscriber参数
Observable deferObservable = Observable.defer(new Func0>() {
@Override
public Observable call() {
return Observable.just("deferObservable");
}
});
range
使用range( ),创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异常。
Observable rangeObservable = Observable.range(1, 5);
timer
使用timer( ),创建一个Observable,它在一个给定的延迟后发射一个特殊的值。
等同于Android中Handler的postDelay( )方法。
Observable timeObservable = Observable.timer(3, TimeUnit.SECONDS); //3秒后发射一个值
repeat
使用repeat( ),创建一个重复发射特定数据的Observable。
Observable repeatObservable =Observable.just("repeatObservable").repeat(3)
Subscriber简化
RxJava提供了Action0等一系列的类似的类,当我们不需要(或者不关心)Subscriber的全部方法(如只关心onNext方法),就可以使用Action类来替代Subscriber。
示例一
当我们并不关心OnComplete和OnError,我们只需要在onNext的时候做一些处理,这时候就可以使用Action1类:
Person person = new Person(21, "js");
Observable observable = Observable.just(person);
observable.subscribe(new Action1() {
@Override
public void call(Person person1) {
Log.e("action1", "call: " + person1.toString());
}
});
示例二
subscribe方法还有两个重载方法,分别是:
- 两个参数: subscribe(onNextAction , onErrorAction)
- 三个参数: subscribe(onNextAction , onErrorAction ,onCompletedAction)
Action1 onNextAction = new Action1() {
@Override
public void call(Person o) {
Log.e("method2", "call: " + o.toString());
}
};
Action1 onErrorAction = new Action1() {
@Override
public void call(Throwable o) {
Log.e("method2", "call: " + o.toString());
}
};
Action0 onCompletedAction = new Action0() {
@Override
public void call() {
Log.e("method2", "call: ");
}
};
observable.subscribe(onNextAction, onErrorAction);
// 或者重载方法
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);
Action0 是 RxJava 的一个接口,它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。这样其实也可以看做将onCompleted() 方法作为参数传进了 subscribe(),相当于其他某些语言中的『闭包』。Action1 也是一个接口,它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error)也是单参数无返回值的,因此 Action1 可以将 onNext(obj) 和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。事实上,虽然 Action0 和 Action1 在 API 中使用最广泛,但 RxJava 是提供了多个 ActionX 形式的接口 (例如 Action2, Action3) 的,它们可以被用以包装不同的无返回值的方法。
更多精彩内容,欢迎关注我的微信公众号——Android机动车