Android 如何防止自定义对话框在asynctask onPostExecute中弹出两次?

Android 如何防止自定义对话框在asynctask onPostExecute中弹出两次?,android,android-asynctask,customdialog,Android,Android Asynctask,Customdialog,我在AsyncTask的onpostexecute方法中使用一个自定义对话框,它被弹出两次。当用户点击一个按钮时,对话框必须关闭,这似乎工作正常 有人能解释一下为什么它会被调用两次吗 @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog != null) { pDialog.dismiss(); } try {

我在AsyncTask的onpostexecute方法中使用一个自定义对话框,它被弹出两次。当用户点击一个按钮时,对话框必须关闭,这似乎工作正常

有人能解释一下为什么它会被调用两次吗

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    if (pDialog != null) {
        pDialog.dismiss();
    }

    try {
        if (responseFromServer.contains("x")) {
            // Pop up to create password
            final Dialog dialog = new Dialog(getActivity());
            dialog.setContentView(R.layout.dialog_password);
            dialog.setTitle("Title...");
            dialog.setCancelable(false);

            final TextView etpassword = (TextView) dialog.findViewById(R.id.etpassword_dialog);
            final Button btnpassword = (Button) dialog
                    .findViewById(R.id.btnsavepassword_dialog);

            btnpassword.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    if (etpassword.getText().toString().length() == 0) {
                        Toast.makeText(getActivity(), "Enter password", Toast.LENGTH_SHORT)
                                .show();
                    } else if (etpassword.getText().toString().length() < 6) {
                        Toast.makeText(getActivity(),
                                "Password should contain minimmum 6 characters",
                                Toast.LENGTH_SHORT).show();
                    } else {
                        dialog.dismiss();

                    }

                }
            });

            if (!dialog.isShowing()) {
                dialog.show();
            }

        }

        else {
            Toast.makeText(getActivity(), "Unexpected error occurred. Please try again",
                    Toast.LENGTH_SHORT).show();
        }

    } catch (Exception e) {
        Log.v("Main FRagment FB async::::::", e.getMessage());
    }

}    
@覆盖
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
如果(pDialog!=null){
pDialog.disclose();
}
试一试{
if(responseFromServer.contains(“x”)){
//弹出窗口以创建密码
最终对话框=新建对话框(getActivity());
setContentView(R.layout.dialog\u密码);
对话框。设置标题(“标题…”);
对话框。可设置可取消(false);
final TextView etpassword=(TextView)dialog.findViewById(R.id.etpassword_dialog);
最终按钮btnpassword=(按钮)对话框
.findviewbyd(R.id.btnsavepassword_对话框);
btnpassword.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(etpassword.getText().toString().length()=0){
Toast.makeText(getActivity(),“输入密码”,Toast.LENGTH\u SHORT)
.show();
}else if(etpassword.getText().toString().length()<6){
Toast.makeText(getActivity(),
“密码应至少包含6个字符”,
吐司。长度(短)。show();
}否则{
dialog.dismise();
}
}
});
如果(!dialog.isShowing()){
dialog.show();
}
}
否则{
Toast.makeText(getActivity(),“出现意外错误,请重试”,
吐司。长度(短)。show();
}
}捕获(例外e){
Log.v(“主片段FB async::”,e.getMessage());
}
}    

您可以在显示自定义对话框之前写入以下条件

if ( !dialog.isShowing() )
{
   dialog.show();
}

您的代码是正确的,代码中没有问题。选中按钮并单击。我认为您正在调用AsyncTask的两次execute()方法。
您能否发布调用代码,例如如何从单击按钮开始调用AsyncTask。

尝试此操作,而不是声明'final Dialog Dialog=new Dialog(getActivity());`在类级别声明对话框。@user3121673对我来说这真是一个奇怪的问题,它不工作。@user3121673您的意思是说当您单击按钮时,您的对话框应该只显示一次。在您的例子中,它显示了2次?@user3121673请发布AsyncTask方法的全部代码。在实例化对话框之前,我在类级别声明了dialog并检查了null条件,现在它工作正常。谢谢你的建议。你是说onPostExecute在同一个任务中被调用了两次吗?或者对话神秘地出现了两次?(按顺序-在第一个任务被取消后立即执行一个任务,或者两者一起执行)?或者您是否有可能有多个任务可能并行运行?我怀疑,当您的对话框可见(并发送消息)时,其他任务正在完成并调用onPostExecute。这只是猜测。@user3121673您是想说您的
ProgressDialog
显示了两次吗?或者您的
自定义对话框
显示了两次?您是否正在使用片段活动?@Anirudh您找到解决方案了吗?