How to combine multiple RxJava chains non-blocking in error case

后端 未结 5 1454
旧巷少年郎
旧巷少年郎 2020-12-15 10:19

My requirements:

  • N Retrofit calls in parallel
  • Wait for all calls to finish (success or failure)
  • If k (0<= k < N) calls fail, they sho
5条回答
  •  佛祖请我去吃肉
    2020-12-15 11:12

    Thanks to @TinTran and this, here is the correct solution:
    (I can't put up the exact syntax for Retrofit Observables now but that shouldn't matter, logic remains the same Retrofit or not)

    Observable.mergeDelayError(getData1(), getData2()).doAfterTerminate(new Action0() {
                @Override
                public void call() {
                    Logger.i("end of all streams");
                    tvTheText.setText("all streams finished");
                }
            }).subscribe(new PrintSubscriber<>("merge" +
                    " delay w error"));
    

    The observables (Retrofit ones should work the same way):

    private Observable getData1() {
            return Observable.create(new Observable.OnSubscribe() {
                @Override
                public void call(Subscriber singleSubscriber) {
                    try {
                        long responseTime = 120 + new Random().nextInt(30);
                        Thread.sleep(responseTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    singleSubscriber.onNext("data 1");
                    singleSubscriber.onCompleted();
                }
            }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
        }
    
        private Observable getData2() {
            return Observable.create(new Observable.OnSubscribe() {
                @Override
                public void call(Subscriber singleSubscriber) {
                    try {
                        long responseTime = 100 + new Random().nextInt(19);
                        Thread.sleep(responseTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    singleSubscriber.onError(new Exception());// this one never blocks the other Observables' streams
                }
            }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
        }
    

    Output logs:

        10-24 15:27:23.335 D: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    10-24 15:27:23.335 D: │ Thread: main
    10-24 15:27:23.335 D: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
    10-24 15:27:23.335 D: │ SafeSubscriber.onNext  (SafeSubscriber.java:134)
    10-24 15:27:23.335 D: │    PrintSubscriber.onNext  (PrintSubscriber.java:32)
    10-24 15:27:23.335 D: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
    10-24 15:27:23.336 D: │ merge delay w error - onNext - data 1
    10-24 15:27:23.336 D: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    10-24 15:27:23.342 V: ⇢ onError(e=java.lang.Exception)
    10-24 15:27:23.342 V: ⇠ onError [0ms]
    10-24 15:27:23.343 I: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    10-24 15:27:23.343 I: │ Thread: main
    10-24 15:27:23.343 I: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
    10-24 15:27:23.343 I: │ OperatorDoAfterTerminate$1.callAction  (OperatorDoAfterTerminate.java:73)
    10-24 15:27:23.343 I: │    MainActivity$1.call  (MainActivity.java:37)
    10-24 15:27:23.343 I: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
    10-24 15:27:23.344 I: │ end of all streams
    10-24 15:27:23.344 I: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    

提交回复
热议问题