Action
Action是RxJava的一个接口,常用的有Action1和Action0
Action0: 它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。
Ation1:它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1 可以将 onNext(obj)和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调
Subscriber的写法是这样的
Observable.just("Hello", "World").
subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Logger.d(s);
}
});
用到的只有 onNext(String s),方法比较多但是有很多不需要,代码也就多了不够简洁,使用Action使代码更简洁更清晰
Observable.just("哈哈哈哈", "发发发发付").subscribe(new Action1<String>() {
@Override
public void call(String s) {
Logger.d(s);
}
});
Action的使用
定义三个对象
Action1<String> onNextAction=new Action1<String>() {
@Override
public void call(String s) {
Logger.d(s);
}
};
Action1<Throwable> onError=new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Logger.d(throwable.getMessage());
}
};
Action0 onCompleted=new Action0() {
@Override
public void call() {
Logger.d("onCompleted");
}
};
根据需要往subscribe()中放入不同的对象
Observable.just("aaaa", "bbbb").subscribe(onNextAction);
Observable.just("eeee", "ggggg").subscribe(onNextAction,onError);
Observable.just("cccc", "dddd").subscribe(onNextAction,onError,onCompleted);
现在有个疑问,为什么使用Action也能达到使用Subscriber的结果?进subscribe(Action1 onNext)的源码看看。
public final Subscription subscribe(final Action1<? super T> onNext) {
if (onNext == null) {
throw new IllegalArgumentException("onNext can not be null");
}
Action1<Throwable> onError = InternalObservableUtils.ERROR_NOT_IMPLEMENTED;
Action0 onCompleted = Actions.empty();
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
其实是把Action对象转化为相应的Subscriber对象了