如何在AlertDialog之后显示ProgressDialog

时间:2012-09-18 19:42:14

标签: java android android-asynctask alertdialog progressdialog

我遇到了无法隐藏的警告对话框。

当用户按下按钮时,我会显示使用以下代码创建的对话框:

new AlertDialog.Builder(this)
            .setTitle(R.string.enterPassword)                
            .setView(textEntryView)          
            .setPositiveButton(R.string.ok, 
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String password = pwdText.getText().toString();
                            dialog.dismiss();
                            processUserAction(password,targetUri);
                        }
                    })
            .setNegativeButton(R.string.cancel, 
                    new DialogInterface.OnClickListener() {                    
                        public void onClick(DialogInterface dialog, int whichButton) {
                            }                
                        })             
            .
            create();

在'processUserAction'方法中执行了一些繁重的操作,在其中我使用的是显示ProgressDialog的AysncTask。

我遇到的问题是提示输入密码的对话框永远不会出现在屏幕上(我尝试过dismiss(),cancel())。 我猜它会一直存在,直到onClick方法完成。

所以,我的问题是如何关闭AlertDialog,所以我可以显示ProgressDialog?

我一直在尝试的另一种方法是在AlertDialog中设置DismissListener并从那里调用繁重的操作,但我没有运气(它没有被调用)。

编辑:添加AsyncTask代码

public class BkgCryptOperations extends AsyncTask<File,Void,Integer>{

    @Override
    protected Integer doInBackground(File... files) {
        if (files!=null && files.length > 0){
            File source = files[0];
            File target = files[1];
            return cryptAction.process(source,password, target);
        }

        return Constants.RetCodeKO;
    }

    CryptAction cryptAction;
    String password;
    ProgressDialog progressDialog;


    public BkgCryptOperations (CryptAction cryptAction,String password,ProgressDialog progressDialog){
        this.cryptAction=cryptAction;
        this.password=password;
        this.progressDialog=progressDialog;
    }

    @Override
    protected void onPreExecute() {
        if (progressDialog!=null){
            progressDialog.show();
        }
    }
    protected void onPostExecute(Integer i) {
        if (progressDialog!=null){
            progressDialog.dismiss();
        }
    }


}

提前致谢

3 个答案:

答案 0 :(得分:1)

你能展示processUserAction(..)的代码吗?没有必要包括解雇。 我做了一些非常相似的事情并且没有问题...... 这是代码:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Export data.\nContinue?")
            .setCancelable(false)
            .setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            String file = getObra().getNome();
                            d = new ProgressDialog(MenuActivity.this);
                            d.setTitle("Exporting...");
                            d.setMessage("please wait...");
                            d.setIndeterminate(true);
                            d.setCancelable(false);
                            d.show();
                            export(file);
                        }
                    })
            .setNegativeButton("No",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
    AlertDialog alert = builder.create();
    alert.show();

在导出(文件)中我打开线程:

private void export(final String file) {


    new Thread() {
        public void run() {
            try {
                ExportData ede = new ExportData(
                        getApplicationContext(), getPmo().getId(),
                        file);
                ede.export();
                handlerMessage("Done!!");
            } catch (Exception e) {
                handlerMessage(e.getMessage());
                System.out.println("ERROR!!!" + e.getMessage());
            }
        }
    }.start();
}

在handlerMessage中,我关闭progressDialog并显示最终消息。 希望它可以帮到你。

答案 1 :(得分:1)

以下是我如何做的例子:

public void daten_remove_on_click(View button) {
        // Nachfragen
        if (spinadapter.getCount() > 0) {
            AlertDialog Result = new AlertDialog.Builder(this)
                    .setIcon(R.drawable.icon)
                    .setTitle(getString(R.string.dialog_data_remove_titel))
                    .setMessage(getString(R.string.dialog_data_remove_text))
                    .setNegativeButton(getString(R.string.dialog_no),
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialogInterface, int i) {
                                    // Nicht löschen
                                    dialogInterface.cancel();
                                }
                            })
                    .setPositiveButton(getString(R.string.dialog_yes),
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialogInterface, int i) {
                                    String _quellenName = myCursor.getString(1);
                                    deleteQuellenRecord(_quellenName);
                                    zuletztGelöscht = _quellenName;
                                }
                            }).show();
        } else {
            // Keine Daten mehr vorhanden
            Toast toast = Toast.makeText(Daten.this,
                    getString(R.string.dialog_data_remove_empty),
                    Toast.LENGTH_SHORT);
            toast.show();
        }
    }

这是deleteQuellenRecord的代码:

private void deleteQuellenRecord(String _quellenName) {
        String DialogTitel = getString(R.string.daten_delete_titel);
        String DialogText = getString(R.string.daten_delete_text);
        // Dialogdefinition Prograssbar
        dialog = new ProgressDialog(this) {
            @Override
            public boolean onSearchRequested() {
                return false;
            }
        };
        dialog.setCancelable(false);
        dialog.setTitle(DialogTitel);
        dialog.setIcon(R.drawable.icon);
        dialog.setMessage(DialogText);
        // set the progress to be horizontal
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // reset the bar to the default value of 0
        dialog.setProgress(0);
        // set the maximum value
        dialog.setMax(4);
        // display the progressbar
        increment = 1;
        dialog.show();
        // Thread starten
        new Thread(new MyDeleteDataThread(_quellenName)) {
            @Override
            public void run() {
                try {
                    // Datensatz löschen
                    myDB.execSQL("DELETE ... ');");
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    myDB.execSQL("DELETE ...);");
                    // active the update handler
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    myDB.execSQL("DELETE ...;");
                    // active the update handler
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    // Einstellung speichern
                    try {
                        settings.edit().putString("LetzteQuelle", "-1")
                                .commit();
                    } catch (Exception ex) {
                        settings.edit().putString("LetzteQuelle", "").commit();
                    }

                } catch (Exception ex) {
                    // Wait dialog beenden
                    dialog.dismiss();
                    Log.e("Glutenfrei Viewer",
                            "Error in activity MAIN - remove data", ex); // log
                                                                            // the
                                                                            // error
                }
                // Wait dialog beenden
                dialog.dismiss();

            }
        }.start();
        this.onCreate(null);
    }

使用异步任务我这样做:

private class RunningAlternativSearch extends
            AsyncTask<Integer, Integer, Void> {


        final ProgressDialog dialog = new ProgressDialog(SearchResult.this) {
            @Override
            public boolean onSearchRequested() {
                return false;
            }
        };



        @Override
        protected void onPreExecute() {
            alternativeSucheBeendet = false;
            String DialogTitel = getString(R.string.daten_wait_titel);
            DialogText = getString(R.string.dialog_alternativ_text);
            DialogZweiteChance = getString(R.string.dialog_zweite_chance);
            DialogDritteChance = getString(R.string.dialog_dritte_chance);
            sucheNach = getString(R.string.dialog_suche_nach);
            dialog.setCancelable(true);
            dialog.setTitle(DialogTitel);
            dialog.setIcon(R.drawable.icon);
            dialog.setMessage(DialogText);
            dialog.setOnDismissListener(new OnDismissListener() {
                public void onDismiss(DialogInterface arg0) {
                    // TODO Auto-generated method stub
                    cancleBarcodeWorker();
                    if (alternativeSucheBeendet==false){
                        // Activity nur beenden wenn die Suche
                        // nicht beendet wurde, also vom User abgebrochen
                        Toast toast = Toast.makeText(SearchResult.this, SearchResult.this
                                .getString(R.string.toast_suche_abgebrochen),
                                Toast.LENGTH_LONG);
                        toast.show();
                        myDB.close();
                        SearchResult.this.finish();
                    }
                }
            });
            dialog.show();
        }


        ...

答案 2 :(得分:0)

您可以在AlertDialog之外创建一个侦听器,以抽象出OnClickListener中的正按钮的逻辑。这样,可以通知监听器,并立即解除AlertDialog。然后,无论处理来自AlertDialog的用户输入的任何处理都可以独立于AlertDialog进行。我不确定这是否是实现这一目标的最佳方式,但过去它对我来说效果很好。

据我所知,我没有看到您的AsyncTask代码有任何明显问题。

public interface IPasswordListener {
    public void onReceivePassword(String password);
}

IPasswordListener m_passwordListener = new IPasswordListener {
    @Override
    public void onReceivePassword(String password) {
        processUserAction(password,targetUri);
    }
}

public void showPasswordDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.enterPassword);
    builder.setView(textEntryView);
    builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            m_passwordListener.onReceivePassword(pwdText.getText().toString());
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    builder.show();
}