由于某些原因,可观察的concatMap在主线程上执行操作

时间:2016-08-14 09:54:00

标签: android multithreading rx-java observable concatmap

我已经有了一系列的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);
                    }
                });

2 个答案:

答案 0 :(得分:2)

concatMap工作正在主线程上进行。您需要将observeOn电话移至subscribe电话正上方。

我还会将对订阅者的重要处理转移到同样位于doOnCompleted之前的doOnErrorobserveOn来电。

答案 1 :(得分:1)

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