Android - 在AsyncTask中显示警报对话框

时间:2013-01-06 17:06:01

标签: android login android-asynctask show alertdialog

当用户无法输入有效的电子邮件和密码登录时,我正在尝试显示警告对话框。由于登录过程必须处理HTTP请求和JSON,我把它全部放在AsyncTask中我就是不确定这是否是我的警报对话框无法显示的问题(我希望不会)。所以这是方法checkUser,在onPostExecute类的AsyncTask内调用:

    public void checkUser(JSONObject json){
                AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                if (tag == login_tag){
                    // check for login response
                    try {
                        if (json.getString(KEY_SUCCESS) != null) {
                            String res = json.getString(KEY_SUCCESS);
                            if(Integer.parseInt(res) == 1){
                                // user successfully logged in
                                // Store user details in SQLite Database
                                // code omitted
                            } else{
                                // Error in login
                                    mProgressDialog.dismiss();
                                builder.setMessage("Incorrect username/password")
                                       .setTitle("Error")
                                       .setNeutralButton("OK", new OnClickListener() {
                                           public void onClick(final DialogInterface dialog,final int which) {
                                                dialog.cancel();                                                    
                                           }
                                        }).create().show();

                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

不知怎的,我的警告对话框永远无法显示,我不知道为什么。如果你知道这个问题的原因是什么,请帮助我。非常感谢!

编辑:结果我在执行此方法后只关闭Progress Dialog,所以我决定在显示警告对话框之前将其关闭。但它仍然没有解决问题。

2 个答案:

答案 0 :(得分:2)

所以我这样解决了这个问题:不知何故,Alert对话框仅在方法checkUser之外工作。所以我将错误if句子中的位移到dismiss()中的onPostExecute()进度对话框之下:

protected void onPostExecute(JSONObject json) {
            checkUser(json);
            mProgressDialog.dismiss();
            try {
                if (json.get(ERROR_MSG) != null){
                    String errorMsg = json.getString(ERROR_MSG);
                    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                    builder.setMessage(errorMsg)
                   .setTitle("Error")
                   .setNeutralButton("OK", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();                                                    
                       }
                    }).create().show();
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

瞧,它有效! P.s:我仍然不知道为什么放入checkUser时对话框无法显示。

答案 1 :(得分:1)

缺少builder.create()

// Error in login
builder.setMessage("Incorrect username/password")
     .setTitle("Error")
     .setNeutralButton("OK", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,int which) {
                                    dialog.cancel();                                                    
     }
 }).create().show();