【问题标题】:Alertdialog does not show警报对话框不显示
【发布时间】:2020-01-14 15:45:55
【问题描述】:

我有一个名为 JsonHandler 的类,它带有异步任务来连接到 api 并获取 json 内容。它用于某些活动,但我无法显示警报对话框“正在加载...请稍候”你能帮我解决这个问题吗?

public class JsonHandler extends AsyncTask<String, Void, String> {

    Context context;
    AlertDialog alertDialog;

    JsonHandler(Context context)
    {
        this.context = context;
    }

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Wait");
        alertDialog.setCanceledOnTouchOutside(false);
        alertDialog.setMessage("Loading please wait...");
        alertDialog.show();
    }

    @Override
    protected String doInBackground(String... urls) {
          //Here program is connecting to api and return needed strings
    }

     @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
       alertDialog.dismiss();
        //Toast.makeText(context, "Update Successful", Toast.LENGTH_SHORT).show();
    }

在主要活动中:

jsonResponse = new JsonHandler(this)
                    .execute("allowedVersion").get();

当我在 onPostExecute 中使用 alertDialog.show() 时,它会显示但为时已晚..

【问题讨论】:

  • 你可以试试这个方法,像你做的那样让警告对话框成为一个全局变量,将alertdialog代码添加到onCreate,然后使用alertdialog.show();在 onPreExecute 然后 alertdialog.dismiss();在 onPostExecute
  • 迈克,如果我要评论驳回它会显示,但我仍然认为它不能正常工作。当我点击按钮 [Check] 时,我可以看到很少的 Freeze,而不是看到 alertDialog。我认为为时已晚:/。在 doInBackground 我正在使用 URLConnection,也许这会产生问题?看起来 onPreExecute 在 doInBackround 完成时有效:/

标签: java android json asynchronous


【解决方案1】:

好的,我想通了! :D。

我到处使用从 AsyncTask 获取数据 .get();这个 GUI 被冻结了片刻,AlertDialog 无法显示。

我发现的最佳解决方案是让接口从 AsyncTask 获取数据。

【讨论】:

    【解决方案2】:

    Alertdialog 是前台的东西,所以它不能在asynctask 的后台方法中完成。这样做吧

    private class JsonHandler extends AsyncTask<String, Void, String> {
         AlertDialog alertDialog;
         protected void onPreExecute() {
        super.onPreExecute();
                alertDialog = new AlertDialog.Builder(YourClasss.this);  
         }
         @Override
         protected String doInBackground(Void... params){       
                return null;
         }
         @Override
         protected void onPostExecute(String result) {
                super.onPostExecute(result);
    
                alertDialog.setTitle("The Process");  
                alertDialog.setIcon(R.drawable.success);
                alertDialog.setCanceledOnTouchOutside(false);
                alertDialog.setMessage("All done!");  
                alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                                      new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int which) {
                                                    Intent A = new Intent(DownloadActivity.this, Menu_activity.class);
                                                    startActivity(A);
                                                    finish();
                                            }
                                        });
                alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {          
                                      @Override
                                      public void onDismiss(DialogInterface dialog) {
                                                Intent A = new Intent(DownloadActivity.this, Menu_activity.class);
                                                startActivity(A);
                                                finish();
                                      }
                        });
                alertDialog.show();
        }
    
    }
    

    【讨论】:

    • 但是当我在 PostExecute 中执行它时,它会在 DoInBackground 完成时显示。有什么方法可以显示 ProgressDialog 或 AlertDialog 但在 DoInbackground 开始之前?
    • 只需使用 alertDialog.dismiss 在后台关闭它。