如何在错误情况下组合多个非阻塞的RxJava链

eri*_*icn 10 android rx-java

我的要求:

  • N Retrofit并行调用
  • 等待所有通话结束(成功或失败)
  • 如果k(0 <= k <N)次调用失败,则不应阻止其他调用.想象一下,失败的调用可以返回null或错误对象,而成功的调用返回ResponseBody对象.
  • 可选:如果RxJava有一个简单的方法来区分哪个调用是针对每个成功或失败的,那么很好,如果没有,我将解析响应并自己弄清楚

是)我有的:

        Observable<ResponseBody> api1Call = api1.fetchData();
        Observable<ResponseBody> api2Call = api2.fetchData();
        Observable<ResponseBody> api3Call = api3.fetchData();

        Observable.combineLatest(api1Call, api2Call, api3Call, new Func2<ResponseBody, ResponseBody, ResponseBody, Object>() {
            @Override
            public Object call(ResponseBody responseBody1, ResponseBody responseBody2, ResponseBody responseBody3) {
                Logger.i("what does this do? - '%s', '%s', '%s'", responseBody1, responseBody2, responseBody3);
                return null;
            }
        }).onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
            @Override
            public Observable<?> call(Throwable throwable) {
                Logger.e(throwable, "some error with one of the apis?");
                return Observable.empty();
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onCompleted() {
                        Logger.i("onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Logger.e(e, "onError");
                    }

                    @Override
                    public void onNext(Object o) {
                        Logger.i("onNext " + o);
                    }
                });
Run Code Online (Sandbox Code Playgroud)

我得到的输出:

some error with one of the apis?
// stacktrace of the error
onCompleted
Run Code Online (Sandbox Code Playgroud)

我是RxJava的新手,非常困惑.我在StackOverflow上找到了一些答案说zip类似的东西,但它甚至超出了我的要求.我猜测其中一个"组合"操作符+正确的异常处理将做我需要的.到目前为止,我们很难弄清楚这一点

我正在使用的版本:

compile 'io.reactivex:rxjava:1.3.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
Run Code Online (Sandbox Code Playgroud)

ali*_*dro 6

  1. 你无法通过实现并行combineLast或者zip,rxjava按顺序在我的测试将执行并发出您的项目.

  2. 如果您的某个任务失败,Func2#call则不会被调用,onError而是会提交.您甚至无法以这种方式获得其他成功任务的结果.

  3. 解决方案是flatMap,它是实现并发的传统方式rxjava.它也符合您的其他要求.

这是一个小但完整的例子.

我用一个简单的网站服务来测试.

我用a Semaphore来等待所有完成的任务,你可以完全忽略它.我将日志记录添加到http请求以便更好地理解,您也可以完全忽略它.

public interface WebsiteService {

    @GET
    Observable<ResponseBody> website(@Url String url);

}
Run Code Online (Sandbox Code Playgroud)

然后我使用以下内容来测试结果rxjava.

   HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);

    Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.google.com")
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build())
            .build();
    WebsiteService websiteService = retrofit.create(WebsiteService.class);

    final Semaphore s = new Semaphore(1);
    try {
        s.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Observable<ResponseBody> first = websiteService.website("http://github.com");
    Observable<ResponseBody> second = websiteService.website("http://stackoverflow.com");
    Observable<ResponseBody> third = websiteService.website("http://notexisting.com");

    final int numberOfCalls = 3; // testing for three calls

    Observable.just(first, second, third)
            .flatMap(new Function<Observable<ResponseBody>, ObservableSource<ResponseBody>>() {
                @Override
                public ObservableSource<ResponseBody> apply(@NonNull Observable<ResponseBody> responseBodyObservable) throws Exception {
                    return responseBodyObservable.subscribeOn(Schedulers.computation());
                }
            })
            .subscribeOn(Schedulers.computation())
            .subscribe(new Observer<ResponseBody>() {

                private int currentDoneCalls = 0;

                private void checkShouldReleaseSemaphore() {
                    if (currentDoneCalls >= numberOfCalls) {
                        s.release();
                    }
                }

                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull ResponseBody responseBody) {
                    System.out.println("Retrofit call success " + responseBody.contentType());
                    synchronized (this) {
                        currentDoneCalls++;
                    }
                    checkShouldReleaseSemaphore();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    System.out.println("Retrofit call failed " + e.getMessage());
                    synchronized (this) {
                        currentDoneCalls++;
                    }
                    checkShouldReleaseSemaphore();
                }

                @Override
                public void onComplete() {
                    System.out.println("onComplete, All request success");
                    checkShouldReleaseSemaphore();
                }

            });

    try {
        s.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("All request done");
        s.release();
    }
Run Code Online (Sandbox Code Playgroud)

我使用rxjava2和改造adapter-rxjava2进行测试.

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'
Run Code Online (Sandbox Code Playgroud)

更新

来自github的RxJava2的介绍页面指出了实现并列主义的实用方法.

实际上,RxJava中的并行性意味着运行独立流并将其结果合并为单个流.操作员flatMap这样做......

虽然这个例子是基于的RxJava2,但操作flatMap已经存在RxJava.


eri*_*icn 0

感谢 @TinTran 和this,这是正确的解决方案:
\n(我现在无法为 Retrofit Observables 提供确切的语法,但这应该不重要,逻辑仍然是相同的 Retrofit 或不)

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

可观察量(改造后的观察量应该以相同的方式工作):

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

输出日志:

\n\n
    10-24 15:27:23.335 D: \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n10-24 15:27:23.335 D: \xe2\x94\x82 Thread: main\n10-24 15:27:23.335 D: \xe2\x94\x9c\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\n10-24 15:27:23.335 D: \xe2\x94\x82 SafeSubscriber.onNext  (SafeSubscriber.java:134)\n10-24 15:27:23.335 D: \xe2\x94\x82    PrintSubscriber.onNext  (PrintSubscriber.java:32)\n10-24 15:27:23.335 D: \xe2\x94\x9c\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\n10-24 15:27:23.336 D: \xe2\x94\x82 merge delay w error - onNext - data 1\n10-24 15:27:23.336 D: \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n10-24 15:27:23.342 V: \xe2\x87\xa2 onError(e=java.lang.Exception)\n10-24 15:27:23.342 V: \xe2\x87\xa0 onError [0ms]\n10-24 15:27:23.343 I: \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n10-24 15:27:23.343 I: \xe2\x94\x82 Thread: main\n10-24 15:27:23.343 I: \xe2\x94\x9c\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\n10-24 15:27:23.343 I: \xe2\x94\x82 OperatorDoAfterTerminate$1.callAction  (OperatorDoAfterTerminate.java:73)\n10-24 15:27:23.343 I: \xe2\x94\x82    MainActivity$1.call  (MainActivity.java:37)\n10-24 15:27:23.343 I: \xe2\x94\x9c\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\xe2\x94\x84\n10-24 15:27:23.344 I: \xe2\x94\x82 end of all streams\n10-24 15:27:23.344 I: \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n
Run Code Online (Sandbox Code Playgroud)\n