Android ProgressDialog在Toast从AsyncTask的doInBackground方法出现之前被解除

Android ProgressDialog在Toast从AsyncTask的doInBackground方法出现之前被解除,android,json,android-asynctask,progressdialog,Android,Json,Android Asynctask,Progressdialog,我正在使用AsyncTask发出一个jsonhttp请求。我在onPreExecute()中创建了一个ProgressDialog,并在onPostExecute()中取消了它。问题是,diInBackground()中有一条Toast消息,显示在出现Toast之前,JSON响应和ProgressDialog被解除,这意味着在生成Toast之前调用onPostExecute()。我怎样才能在土司出现之前取消它 这是我的密码 private class login extends AsyncTa

我正在使用
AsyncTask
发出一个
jsonhttp
请求。我在
onPreExecute()
中创建了一个
ProgressDialog
,并在
onPostExecute()
中取消了它。问题是,
diInBackground()
中有一条Toast消息,显示在出现
Toast
之前,JSON
响应和
ProgressDialog
被解除,这意味着在生成
Toast
之前调用
onPostExecute()
。我怎样才能在
土司出现之前取消它

这是我的密码

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();
      }
      }
私有类登录扩展异步任务{
私有进程对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//“创建和启动进度”对话框
progressDialog=新建progressDialog(LoginActivity.this);
progressDialog.setMessage(“加载…”);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
字符串url=”http://api.openweathermap.org/data/2.5/weather?q=London,英国”;
JsonObjectRequest req=新的JsonObjectRequest(url,null,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_SHORT).show();
}
}
捕获(例外e){
Toast.makeText(getApplicationContext(),“服务器错误!”,Toast.LENGTH\u SHORT.show();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
e(“来自错误响应服务器错误..:”,error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(req);
返回null;
}
@凌驾
受保护的void onPostExecute(void v){
//终止进度对话框
progressDialog.disclose();
}
}
这个代码完全错误您不能从doInBackground添加吐司。。你需要在解雇迪奥洛格之后移动这个

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

您可以在toast显示后使用TimerTask手动关闭对话框。您可以看到如何使用TimerTask。您正在使用Toast.LENGTH\u SHORT,因此Toast将显示2秒钟。

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

 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);
stringurl=”http://api.openweathermap.org/data/2.5/weather?q=London,英国”;
JsonObjectRequest req=新的JsonObjectRequest(url,null,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
如果(progressDialog.isShowing){
progressDialog.cancel();
}
试一试{
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_SHORT).show();
}
}
捕获(例外e){
Toast.makeText(getApplicationContext(),“服务器错误!”,Toast.LENGTH\u SHORT.show();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
e(“来自错误响应服务器错误..:”,error.getMessage());
如果(progressDialog.isShowing){
progressDialog.cancel();
}
}
});
AppController.getInstance().addToRequestQueue(req);

我希望这将有助于您,无需AsyncTask。

关闭响应和错误侦听器中的progressdialog…无需关闭on-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
  }
  }
私有类登录扩展异步任务{
私有进程对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//“创建和启动进度”对话框
progressDialog=新建progressDialog(LoginActivity.this);
progressDialog.setMessage(“加载…”);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
字符串url=”http://api.openweathermap.org/data/2.5/weather?q=London,英国”;
JsonObjectRequest req=新的JsonObjectRequest(url,null,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_SHORT).show();
}
}
捕获(例外e){
Toast.makeText(getApplicationContext(),“服务器错误!”,Toast.LENGTH\u SHORT.show();
progressDialog.Disclose();添加此行
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
e(“来自错误响应服务器错误..:”,error.getMessage());
progressDialog.Disclose();添加此行
}
});
AppController.getInstance().addToRequestQueue(req);
返回null;
}
@凌驾
受保护的void onPostExecute(void v){
//终止进度对话框
//progressDialog.Disclose();注释此行
}
}

如果要打印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 
                    }
                });

你怎么能从背景中称之为吐司呢
   Handler h = new Handler(this.getMainLooper());
                h.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),response.toString() , Toast.LENGTH_SHORT).show();
                        //stopProgress 
                    }
                });