Android RXJava调用前未显示进度对话框
我有下面的代码,在我做一个长时间运行的任务之前,我在RxJava2中启动一个ring对话框。问题是对话框没有出现,而且我认为我没有阻塞主UI线程Android RXJava调用前未显示进度对话框,android,rx-java,progressdialog,Android,Rx Java,Progressdialog,我有下面的代码,在我做一个长时间运行的任务之前,我在RxJava2中启动一个ring对话框。问题是对话框没有出现,而且我认为我没有阻塞主UI线程 fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (ringProgressDialog != null) { if
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ringProgressDialog != null) {
if (ringProgressDialog.isShowing()) {
ringProgressDialog.dismiss();
}
}
ringProgressDialog = ProgressDialog.show(SendConversationsActivity.this,
getResources().getString(R.string.creating_document_progress_dialog_title),
getResources().getString(R.string.conversation_progress_dialog_text),
true, false);
FileNameAndContacts filenameAndContacts = new FileNameAndContacts();
if (tvNoDatSelected.getVisibility() != View.VISIBLE) {
filenameAndContacts.setFileName("");
}
createDocument(filenameAndContacts)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> Timber.e(throwable, "Error in getting document"))
.subscribe(fileAndContacts -> {
if (ringProgressDialog.isShowing()) { //debugger says
//dialog is showing.
ringProgressDialog.dismiss();
}
sendDocumentInEmail(fileAndContacts);
});
}
任务正确执行。在同一活动中执行另一个RXJava任务之前,我还会显示另一个ring progress对话框,这个对话框会显示出来
如果我注释掉RxJava调用,就会显示对话框。因此,RxJava调用中存在阻塞
//编辑
这个简单的可观察对象也会阻止进度对话框的显示,但Toast会显示:
Observable.just("Hello, world")
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable -> {
Toast.makeText(SendConversationsActivity.this, "Toast...", Toast.LENGTH_SHORT).show();
//ringProgressDialog.show();
})
.doOnTerminate(() -> {
//ringProgressDialog.dismiss();
})
.subscribe(s -> {
//Toast.makeText(SendConversationsActivity.this, s, Toast.LENGTH_SHORT).show();
ringProgressDialog.dismiss();
});
我建议这样做RxAndroid2
// Init your dialog
ProgressDialog ringProgressDialog = new ProgressDialog(this);
ringProgressDialog.setTitle("Your Title");
ringProgressDialog.setMessage("Your message");
createDocument(filenameAndContacts)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable -> ringProgressDialog.show())
.doOnTerminate(() -> {
if (ringProgressDialog.isShowing()) {
ringProgressDialog.dismiss();
}
})
.concatMap(fileAndContacts -> sendDocumentInEmail(fileAndContacts))
.subscribe(this::onSuccess, this::onError)
private void onSuccess() {
// Do anything you want on Android main thread
}
private void onError() {
// Timber..
}
解释
只要您的可观察对象开始订阅,就会调用doOnSubscribe方法,并且在生成的可观察对象终止之前,会调用doOnSubscribe方法,无论是正常还是有错误
然后,如果您想在获得fileAndContacts后执行另一项操作,如sendDocumentInEmail,只需使用concatMap即可
所以,无论何时发生错误,您都可以用onError方法处理它
这样做将帮助您避免回调地狱或副作用,这很容易导致您容易出错
参考:
希望这有帮助我建议这样做RxAndroid2
// Init your dialog
ProgressDialog ringProgressDialog = new ProgressDialog(this);
ringProgressDialog.setTitle("Your Title");
ringProgressDialog.setMessage("Your message");
createDocument(filenameAndContacts)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable -> ringProgressDialog.show())
.doOnTerminate(() -> {
if (ringProgressDialog.isShowing()) {
ringProgressDialog.dismiss();
}
})
.concatMap(fileAndContacts -> sendDocumentInEmail(fileAndContacts))
.subscribe(this::onSuccess, this::onError)
private void onSuccess() {
// Do anything you want on Android main thread
}
private void onError() {
// Timber..
}
解释
只要您的可观察对象开始订阅,就会调用doOnSubscribe方法,并且在生成的可观察对象终止之前,会调用doOnSubscribe方法,无论是正常还是有错误
然后,如果您想在获得fileAndContacts后执行另一项操作,如sendDocumentInEmail,只需使用concatMap即可
所以,无论何时发生错误,您都可以用onError方法处理它
这样做将帮助您避免回调地狱或副作用,这很容易导致您容易出错
参考:
希望这有帮助
createDocument是如何实现的?创建,从可调用
@我先做计算,然后做一个.justfilename和contacts 正如所怀疑的那样,您在当前主线程上计算文档并阻塞它。您应该将其移动到fromCallable中,当与subscribeOnSchedulers.io结合使用时,它将在后台进行计算: createDocument是如何实现的?创建,从可调用
@我先做计算,然后做一个.justfilename和contacts 正如所怀疑的那样,您在当前主线程上计算文档并阻塞它。您应该将其移动到fromCallable中,当与subscribeOnSchedulers.io结合使用时,它将在后台进行计算:
createDocument是如何实现的?create,fromCallable?@akarnokd我进行计算,然后执行单个.justfilename和contacts。检查我的回答createDocument是如何实现的?创建,fromCallable?@akarnokd我进行计算,然后执行单个.justFileName和Contacts。检查我的回答在RXJava 2中没有DooInterminate或concatMap。仅FYI.doInterminate和concatMap已在偶数RxJava1中发布。你试过了吗?参考:有一个DOAFTERMINATE。rxjava2是从头重写的,它与rxjava1完全不同。它仍然保持着这个功能。请再次检查,您是否至少尝试过一次?在RXJava 2中,没有DooInterminate或concatMap。仅FYI.doInterminate和concatMap已在偶数RxJava1中发布。你试过了吗?参考:有一个DOAFTERMINATE。rxjava2是从头重写的,它与rxjava1完全不同。它仍然保持着这个功能。请再次检查您是否至少尝试过一次?我尝试过将测试代码更改为Observable.fromCallable->Hello World,但仍然没有显示ProgressDialog。然而,它确实显示了祝酒词。也许它只是因为计算简单而立即消失。在fromCallable之后应用delay1,TimeUnit.SECONDS,给主线程一些时间。就是这样。对话出现了。非常感谢。我尝试将测试代码更改为Observable.fromCallable->helloworld,但仍然没有显示ProgressDialog。然而,它确实显示了祝酒词。也许它只是因为计算简单而立即消失。在fromCallable之后应用delay1,TimeUnit.SECONDS,给主线程一些时间。就是这样。对话出现了。非常感谢。