Наблюдаемый 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);
}
})
...