Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RXJava调用前未显示进度对话框_Android_Rx Java_Progressdialog - Fatal编程技术网

Android RXJava调用前未显示进度对话框

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

我有下面的代码,在我做一个长时间运行的任务之前,我在RxJava2中启动一个ring对话框。问题是对话框没有出现,而且我认为我没有阻塞主UI线程

  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,给主线程一些时间。就是这样。对话出现了。非常感谢。