上一篇笔记中,我们创建了Oberver,Observable,并使用订阅建立了两者关系。但是代码略显冗长,这篇笔记中我们使用更简单的代码完成同样的需求。
RxJava提供了Action0,Action1,...,Action9接口,他们是这样定义的:
public interface Action0 extends Action
{
void call();
}
public interface Action1<T> extends Action
{
void call(T var1);
}
public interface Action9<T1, T2, T3, T4, T5, T6, T7, T8, T9> extends Action
{
void call(T1 var1, T2 var2, T3 var3, T4 var4, T5 var5, T6 var6, T7 var7, T8 var8, T9 var9);
}
实际上,这些接口就是用来传入回调函数的,Action接口的泛型是函数的参数,所有函数返回void类型。
Observer实际上就可以看成一个回调函数,Observable发出某个事件,由一个函数响应这个事件,响应事件的代码就是Observer。因此RxJava提供了这些Action接口,用来简化Observer的写法,例子如下:
//创建被观察者
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>()
{
@Override
public void call(Subscriber<? super String> subscriber)
{
subscriber.onNext("hello1");
subscriber.onNext("hello2");
subscriber.onNext("hello3");
subscriber.onCompleted();
}
});
//订阅
observable.subscribe(new Action1<String>()
{
@Override
public void call(String s)
{
System.out.println(s);
}
}, new Action1<Throwable>()
{
@Override
public void call(Throwable throwable)
{
}
}, new Action0()
{
@Override
public void call()
{
System.out.println("completed");
}
});
如上述代码,subscribe()函数提供了Action作参数的重载,这种写法可以看成没有创建Observer对象,而是直接传入回调函数。
实际上,上面代码中,我们可以把Observable的创建和订阅串起来,然后使用Java8的lambda表达式简化Java传入回调函数的写法。
//简化的代码
Observable.create((subscriber) ->
{
subscriber.onNext("hello1");
subscriber.onNext("hello2");
subscriber.onNext("hello3");
subscriber.onCompleted();
}).subscribe((s) ->
{
System.out.println(s);
}, (throwable) ->
{
}, () ->
{
System.out.println("completed");
});
create()
是创建事件队列最基本的方法,实际上还有一些简化的写法。
* Observable.from(T[])
:将传入的数组或可迭代对象拆分成单个对象依次发送
* Observable.just(T...)
:将传入的参数依次发送
创建简化的事件队列例子:
Observable
.just("hello1", "hello2", "hello3")
.subscribe((s) -> {
System.out.println(s);
}, (throwable) -> {
}, () -> {
System.out.println("completed");
});
注意: * 实际上from(),just()也可以看成转换成create(),并多次调用onNext(),最后调用onComplete()。 * 有时,onError和onComplete并不需要,subscribe()提供了这样的重载,只有一个onNext()回调的Action1参数。这里就不演示了。
如上述代码,远远比最初的写法简单了。实际使用中,建议使用这种简化的写法。实际上,使用JavaScript等对函数式编程支持比较好的语言时,并不用像Java这样绕这么多弯,Java代码规范化的优势其实某些时候过于死板,也是一种缺陷。