Наблюдаемый concatMap делает вещи в главном потоке по некоторым причинам

У меня есть цепочка Observables и диалоговое окно, которое закрывается после того, как все закончено. Порядок такой: 1 вызов API получить ResponseBody 2 принять процесс тела ответа (не поток пользовательского интерфейса) 3 другой процесс (не поток пользовательского интерфейса)

Во время первого вызова диалог в порядке, когда дело доходит до второго, и я получаю тело первого вызова, диалоговое окно блокируется, и оно остается без изменений в течение остального времени.

В конце после того, как все сделано, но я получаю предупреждение говорит, что "приложение делает много работы в главном потоке".

Я ничего не делаю в главном потоке, поэтому я не совсем понимаю, как я могу разблокировать диалог и сохранить все в отдельном потоке.

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 ответа

Решение

concatMap работа происходит в главном потоке. Вам нужно переместить observeOn позвонить чуть выше subscribe вызов.

Я бы также перенес значительную обработку из подписчика в doOnCompleted а также doOnError звонки, которые также размещены перед 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);
          }
})
...
Другие вопросы по тегам