1

我有一个 Observables 链和一个对话框,在一切完成后关闭。顺序是:1 api 调用获取 ResponseBody 2 获取响应主体进程(不是 ui 线程) 3 其他进程(不是 ui 线程)

在第一次通话期间,对话没问题,当涉及到第二次通话时,我收到了第一次通话的正文,对话被阻止,其余时间保持不变。

一切都完成后最后,但我收到一条警告说“该应用程序正在主线程上做很多工作”。

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

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);
                    }
                });
4

2 回答 2

2

这项concatMap工作正在主线程上进行。您需要将呼叫移至observeOn呼叫上方subscribe

我还将重要的处理从订户移到doOnCompleteddoOnError放置在observeOn.

于 2016-08-14T10:16:25.993 回答
1
于 2016-08-14T10:21:13.490 回答