startWith的作用是在发射的数据头部添加数据。
测试:
@Test
public void startWith(){
System.out.println("头部添加一个数据------------------");
Observable.just(2,3).startWith(1).subscribe(i->{
System.out.println(i);
});
System.out.println("头部添加多个数据------------------");
Observable.just(2,3).startWith(0,1).subscribe(i->{
System.out.println(i);
});
System.out.println("头部添加多个数据------------------");
List<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
Observable.just(2,3).startWith(list).subscribe(i->{
System.out.println(i);
});
}
输出:
头部添加一个数据------------------
1
2
3
头部添加多个数据------------------
0
1
2
3
头部添加多个数据------------------
0
1
2
3
查看方法源码:
public final Observable<T> startWith(T t1) {
return concat(just(t1), this);
}
内部实际调用的是concat方法,说明凡是concat的特性,startWith也存在。
RxJava:concat(连接)、 concatDelayError、 concatEager的使用
1、串行
这个特性意味着,如果我们给头部的数据源增加延迟,则会无法收到数据。
测试:
@Test
public void startWithDelay() throws InterruptedException {
//延迟3s发射数据
Observable<Integer> just = Observable.just(0,1).delay(3, TimeUnit.SECONDS);
Observable.just(2,3).startWith(just).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("StartWith.onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("StartWith.onError");
}
@Override
public void onNext(Integer integer) {
System.out.println("StartWith.onNext");
}
}
);
//延迟2s结束方法
Thread.sleep(2*1000);
}
输出:
//没有任何输出
2、OnError的处理
concat有个特殊的方法concatDelayError,使用这个方法时,即使其中一个数据源出现了错误,也不会终止其他数据源的发射。startWith内部没有调用concatDelayError,因此,出现错误时,startWith会终止执行。
@Test
public void startWithError(){
Observable<Integer> just = Observable.just(0,1).doOnNext(new Action1<Integer>() {
@Override
public void call(Integer integer) {
throw new NullPointerException();
}
});
Observable.just(2,3).startWith(just).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("StartWith.onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("StartWith.onError");
}
@Override
public void onNext(Integer integer) {
System.out.println("StartWith.onNext");
}
});
}
输出:
StartWith.onError