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

标签 android multithreading rx-java observable concatmap

我有一个 Observable 链和一个对话框,在一切都完成后会消失。顺序是这样的: 1 api调用获取ResponseBody 2 取response body进程(非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);
                    }
                });

最佳答案

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

我还会将订阅者的重要处理移到 doOnCompleteddoOnError 调用中,它们也放在 observeOn 之前。

关于android - 由于某些原因,Observable concatMap 在主线程上做事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38941068/

相关文章:

java - 使用线程的 Java 多客户端简单聊天(非 GUI)服务器

java - 一个额外的线程极大地提高了性能

java - RxJava : Using SubscribeOn makes the program exit without completing

Android : How to convert view to Bitmap, 没有捕获背景屏幕

java - ArrayList for 循环最有效的实现是什么?

java - 如何对我的顺序 Java 代码进行多线程处理

java - RxJava Observable 最短执行时间

java - 如何在另一个线程上运行 RxJava 观察者

java - Cloud Firestore - 从多个位置获取文档

安卓和引擎 : handling Collission Detection properly