android - 在 RXJava 调用之前未显示进度对话框

标签 android rx-java progressdialog

我有以下代码,在执行长时间运行的任务之前,我在 RxJava2 中启动了一个环形对话框。问题是对话框没有显示,我认为我没有阻塞主 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);

                    });
     }

任务正确执行。在同一 Activity 中执行另一个 RXJava 任务之前,我还显示了另一个环形进度对话框,这个出现了。

如果我注释掉 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();
                    });

最佳答案

How is createDocument implemented? create, fromCallable

@akarnokd I do the calculations then do a Single.just(fileNameAndContacts)

正如所怀疑的那样,您在当前线程(主线程)上计算文档并阻塞它。您应该将它移到 fromCallable 中,当与 subscribeOn(Schedulers.io()) 结合使用时,它将在后台进行计算:

Observable.fromCallable(() -> {
     /* compute the document here */
    return fileNameAndContacts;
}); 

关于android - 在 RXJava 调用之前未显示进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573892/

相关文章:

android - RxAndroid 过滤器 Observable<List<Item>>

java - 如何在 RxJava 中让多个订阅者订阅一个分组的 Observable?

java - 具有多个订阅者和事件的 RxJava 并发

android - 在 Activity 之间切换时显示白屏

android - 如何在 C/C++ 文件中检测 Android NDK 的编译?

android - 如何检测webView中的按键事件?

android - 在Android中调用自定义View的onDraw()方法

java - 如何在不导致窗口泄漏的情况下将 ProgressDialog 与 AsyncTask 一起正确使用?

android - 如何在加载包含多个以编程方式创建的 View 的新 View 时显示进度对话框?

java - 使用对话框等待 AsyncTask