我有一个 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
调用的正上方。
我还会将订阅者的重要处理移到 doOnCompleted
和 doOnError
调用中,它们也放在 observeOn
之前。
关于android - 由于某些原因,Observable concatMap 在主线程上做事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38941068/