나는 약간의 시간이 소요되는 네트워크를하지 실행 방법은 IO 스레드에서 호출이RxJava 배압 (빠른 생산 속도가 느린 소비자)
예를 들어 다음
/**
* network call
* @param value
* @return
*/
private Observable<Integer> execute(final int value) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("done " + value);
subscriber.onNext(value);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io());
}
전에서 실행해야합니다 "명령"의 목록을 가지고 주문. (잇달아)는
는예
started 0
started 1
started 2
started 3
started 4
done 0
done 1
done 2
done 4
done 3
Produses 빠른
을 소모보다 내고 이러한 방식public List<Integer> testObservableBackpressure(){
return Observable.range(0,5).flatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer integer) {
System.out.println("started " + integer);
return exeute(integer);
}
}).toList().toBlocking().single();
}
이다 (Observable.range은 (X는 Y) 명령의리스트를 나타낸다)
내가 원하는
started 0
done 0
started 1
done 1
started 2
done 2
...
같은 결과 17,451,515,
하지만 ..
public List<Integer> testObservableBackpressure(){
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(final Subscriber<? super Integer> subscriber) {
Observable.range(0,5).subscribe(new Subscriber<Integer>() {
@Override
public void onStart() {
request(1);
}
@Override
public void onCompleted() {
subscriber.onCompleted();
}
@Override
public void onError(Throwable e) {
subscriber.onError(e);
}
@Override
public void onNext(Integer integer) {
System.out.println("started " + integer);
execute(integer).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
subscriber.onNext(integer);
request(1);
}
});
}
});
}
}).toList().toBlocking().single();
}
예상대로 결과가 이런 식으로
started 0
done 0
started 1
done 1
started 2
done 2
started 3
done 3
started 4
이 문제를 처리하기 위해 다른 더 우아한 방법이 있는지 내 질문이 될 것이다? 난 당신의 코드가 실행될 때 얻을
Perfect! 감사. 결과 예상대로 – Palaima