在Handler中创建警报对话框

时间:2012-04-25 14:09:12

标签: android multithreading

我想从一个处理程序创建一个警告对话框,当一个线程终止时它会发出信号,这是我的代码导致:

  

android.view.WindowManager $ BadTokenException:无法添加窗口 -   token null不适用于应用程序

Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {

        if (dialog != null)
        {
            dialog.dismiss();
            dialog = null;
        }

        switch (serverResponseCode)
        {
        case 200:
        {
            AlertDialog alertDialog;
            alertDialog = new AlertDialog.Builder(getApplicationContext()).create();
            alertDialog.setTitle("Super :)");
            alertDialog.setMessage("Poza a fost trimisa cu success.");
            alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int id) {

                     finish();

                } }); 
            alertDialog.show();
            serverResponseCode = -1;

            break;
        }
        default:
        {
            AlertDialog alertDialog;
            alertDialog = new AlertDialog.Builder(getApplicationContext()).create();
            alertDialog.setTitle("Eroare :(");
            alertDialog.setMessage("Eroare la trimiterea pozei.");
            alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int id) {

                     finish();

                } }); 
            alertDialog.show();

            break;
        }
        }


         }
     };

3 个答案:

答案 0 :(得分:5)

问题可能是getApplicationContext()不是你的活动上下文。

    alertDialog = new AlertDialog.Builder(getApplicationContext()).create();
    //should be change to
    alertDialog = new AlertDialog.Builder( YourActivity.this ).create();

答案 1 :(得分:3)

您无法使用应用程序上下文来创建对话框。使用活动上下文 代替。

此外,创建对话框的方式必然会在以后产生问题,尤其是在因任何原因重新启动活动时。您应该使用Dialog片段或托管对话框(Activity的showDialog()方法)

答案 2 :(得分:1)

我确信您在Android内部正在进行WebService请求/响应,然后我建议您在android中实现AsyncTask,因为您不需要打扰Thread管理。

仅供参考,在doInBackground()内 - 在onPostExecute()内写下网络电话逻辑 - 显示您想要显示的警告对话框。