【问题标题】:ProgressDialog getting Dismissed before Toast appears from doInBackground method of AsyncTaskProgressDialog 在 Toast 从 AsyncTask 的 doInBackground 方法出现之前被解雇
【发布时间】:2015-06-19 12:51:08
【问题描述】:

我正在使用AsyncTask 发出JSON HTTP 请求。我在onPreExecute() 中创建了一个ProgressDialog,我在onPostExecute() 中将其关闭。问题是,diInBackground() 中有一条 Toast 消息,它显示 JSON responseProgressDialogToast 出现之前被解除,这意味着 onPostExecute() 在生成 Toast 之前被调用。如何在 Toast 出现之前将其关闭?

这是我的代码。

private  class login extends AsyncTask<Void,Void,Void>{
      private ProgressDialog progressDialog;

      @Override
      protected void onPreExecute(){
          super.onPreExecute();
          // Create & Start Progress Dialog
          progressDialog = new ProgressDialog(LoginActivity.this);
          progressDialog.setMessage("Loading...");
          progressDialog.show();
      }
      @Override
      protected Void doInBackground(Void... params) {
          String url = "http://api.openweathermap.org/data/2.5/weather?q=London,uk";
          JsonObjectRequest req = new JsonObjectRequest(url, null,
                  new Response.Listener<JSONObject>() {

                      @Override
                      public void onResponse(JSONObject response) {

                          try {

                                  Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();

                              }

                          }
                          catch (Exception e){
                              Toast.makeText(getApplicationContext(),"Server error!..",Toast.LENGTH_SHORT).show();

                          }


                      }
                  }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                  VolleyLog.e("from on error response Server Error..: ", error.getMessage());

              }
          });

          AppController.getInstance().addToRequestQueue(req);

            return null;
      }
      @Override
      protected void onPostExecute(Void v){
          // Terminate Progress Dialog
          progressDialog.dismiss();
      }
      }

【问题讨论】:

  • 如何从后台线程调用 Toast ?我认为这段代码是错误的。
  • 好的。但是如何从 onPostExecute() 访问响应对象?在 doInBackground() 完成后不再可以访问它。 (我需要将 Result 设置为 JSONObject 吗?)

标签: android json android-asynctask progressdialog


【解决方案1】:

无需在异步任务中编写 Volley 请求。您可以直接执行该任务,因为它在内部使用线程。因此,一旦您收到响应或失败,您就可以自行关闭对话框。我想它会帮助你

 String url = "http://api.openweathermap.org/data/2.5/weather?q=London,uk";
      JsonObjectRequest req = new JsonObjectRequest(url, null,
              new Response.Listener<JSONObject>() {

                  @Override
                  public void onResponse(JSONObject response) {

      if(progressDialog.isShowing){
     progressDialog.cancel();
       }
                      try {

                              Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();

                          }

                      }
                      catch (Exception e){
                          Toast.makeText(getApplicationContext(),"Server error!..",Toast.LENGTH_SHORT).show();

                      }


                  }
              }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
              VolleyLog.e("from on error response Server Error..: ", error.getMessage());
  if(progressDialog.isShowing){
 progressDialog.cancel();
   }
          }
      });

      AppController.getInstance().addToRequestQueue(req);

我希望这会对你有所帮助而且不需要 AsyncTask。

【讨论】:

    【解决方案2】:
    try {
    
                                  Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();
    
                              }
    
                          }
                          catch (Exception e){
                              Toast.makeText(getApplicationContext(),"Server error!..",Toast.LENGTH_SHORT).show();
    
                          }
    

    这段代码完全错误。 您不能从 doInBackground 添​​加 Toast。 。您需要在关闭对话后移动它

    // Terminate Progress Dialog
          progressDialog.dismiss();
    //Add your Toast here
    

    【讨论】:

      【解决方案3】:

      您可以在 toast 显示后手动关闭对话框,使用 TimerTask。您可以查看如何使用 TimerTask HERE。您正在使用 Toast.LENGTH_SHORT,因此 toast 将显示 2 秒。

      【讨论】:

        【解决方案4】:

        关闭响应和错误监听器中的进度对话框...无需关闭 post 方法

        private  class login extends AsyncTask<Void,Void,Void>{
          private ProgressDialog progressDialog;
        
          @Override
          protected void onPreExecute(){
              super.onPreExecute();
              // Create & Start Progress Dialog
              progressDialog = new ProgressDialog(LoginActivity.this);
              progressDialog.setMessage("Loading...");
              progressDialog.show();
          }
          @Override
          protected Void doInBackground(Void... params) {
              String url = "http://api.openweathermap.org/data/2.5/weather?q=London,uk";
              JsonObjectRequest req = new JsonObjectRequest(url, null,
                      new Response.Listener<JSONObject>() {
        
                          @Override
                          public void onResponse(JSONObject response) {
        
                              try {
        
                                      Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();
        
                                  }
        
                              }
                              catch (Exception e){
                                  Toast.makeText(getApplicationContext(),"Server error!..",Toast.LENGTH_SHORT).show();
              progressDialog.dismiss(); add this line
        
                              }
        
        
                          }
                      }, new Response.ErrorListener() {
                  @Override
                  public void onErrorResponse(VolleyError error) {
                      VolleyLog.e("from on error response Server Error..: ", error.getMessage());
              progressDialog.dismiss(); add this line
        
                  }
              });
        
              AppController.getInstance().addToRequestQueue(req);
        
                return null;
          }
          @Override
          protected void onPostExecute(Void v){
              // Terminate Progress Dialog
              //progressDialog.dismiss(); comment this line
          }
          }
        

        【讨论】:

          【解决方案5】:

          你想打印 toast 消息然后你可以使用 处理程序。

             Handler h = new Handler(this.getMainLooper());
                          h.post(new Runnable() {
                              @Override
                              public void run() {
                                  Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();
                                  //stopProgress 
                              }
                          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-27
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多