由于某些原因,Observable concatMap 在主线程上做事

Observable concatMap does things on the main thread for some reasons

我有一个 Observable 链和一个对话框,在一切都完成 finished.The 之后,这个对话框正在消失,顺序是这样的: 1 api 调用获取 ResponseBody 2 取响应体进程(不是ui线程) 3 个其他进程(不是 ui 线程)

在第一个调用期间,对话框正常,当涉及到第二个时,我收到第一个调用的正文,对话框被阻止,其余时间保持原样。

最后,一切都完成后,我收到一条警告说 "The app is doing to much work on the main thread"。

我没有在主线程上做任何事情,所以我不太明白如何取消阻止对话框并将所有内容都放在单独的线程上。

showLoadingDialog();

        mZappAppApis.downloadDatabase(Token.getToken(AppConfig.TOKEN_SYNC_DOWNLOAD_DATABASE))
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .concatMap(new Func1<ResponseBody, Observable<String>>() {
                    @Override
                    public Observable<String> call(ResponseBody responseBody) {
                        return mDatabaseFileHelper.writeDatabaseToFile(responseBody);
                    }
                })
                .concatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return mDatabaseFileHelper.copyDatabaseIntoZappApp();
                    }
                })
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        dismissLoadingDialog();

                        saveLocalTimestamp(timestamp);

                        flowContinueInterface.onContinueFlow();
                    }

                    @Override
                    public void onError(Throwable e) {
                        Logger.e(e, "Error during processing new database");

                        dismissLoadingDialog();

                        flowContinueInterface.onStopFlow();
                    }

                    @Override
                    public void onNext(String result) {
                        Logger.d(result);
                    }
                });

concatMap 工作正在主线程上进行。您需要将 observeOn 调用移动到 subscribe 调用的正上方。

我还会将订阅者的重要处理移到 doOnCompleteddoOnError 调用中,这些调用也放在 observeOn.

之前

将您的 .observeOn(AndroidSchedulers.mainThread()) 移至 subscribe(… 电话上方。 observeOn(… 之后的所有内容都在此线程上执行。 您可以通过打印出您所在的当前线程来看到这一点:

.subscribeOn(Schedulers.newThread())
.concatMap(new Func1<String, Observable<String>>() {
            @Override
            public Observable<String> call(final String string) {
                    Log.i("Before", Thread.currentThread().toString());
                    return Observable.just(string);
                }
            })
.observeOn(AndroidSchedulers.mainThread())
.concatMap(new Func1<String, Observable<String>>() {
          @Override
          public Observable<String> call(final String string) {
                    Log.i("After", Thread.currentThread().toString());
                    return Observable.just(string);
          }
})
...