AsyncTask超时时对话框被取消



我正在启动网络连接的AsyncTask,并决定10秒的超时之后,如果出现网络问题,应取消任务

final aTask record = new aTask();
record.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
          record.cancel(true);
      Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
      }
  }
}, 10000 );

我注意到Spinner对话框总是在异步任务取消后运行。我如何驳回

更简单的事情是在处理程序代码中添加dialog.disse()

        final aTask record = new aTask();
        record.execute();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable()
        {
          @Override
          public void run() {
              if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
                  record.cancel(true);
                  dialog.dismiss(); <----------------- ADDED HERE
              Toast.makeText(MainActivity.this, "Error in handling recording: connection       timeout", Toast.LENGTH_SHORT).show();
              }
          }
        }, 10000 );

非常感谢大家的帮助

当您取消异步任务时,她不会离开doInBackground。。。

区块报价可以通过调用cancel(布尔值)随时取消任务。调用此方法将导致后续对isCancelled()的调用返回true。调用此方法后,doInBackground(Object[])返回后将调用onCancelled(Object),而不是onPostExecute(Object)。为了确保任务尽快取消,如果可能的话(例如在循环中),您应该始终定期从doInBackground(Object[])检查isCancelled()的返回值

只需偶尔检查一下isCancelled():

 protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }

全局声明Dialog,类似

Dialog dlg;

AsynTaskonPreExecute

dlg = new Dialog(MainActivity.this);
dlg.show();

doInBackground

if(this.isCancelled())
dlg.dismiss();

AyncTaskonPostExecute中进行

 handler.postDelayed(new Runnable()
        {
          @Override
          public void run() {
              if ( this.getStatus() == AsyncTask.Status.RUNNING ) {
                  if(dlg.isShowing())
                  dlg.dismiss();
              Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
              }
          }
        }, 10000 );

或者,如果你只是想在AsynTask完成任务后关闭对话框,那么在onPostExecute内部只需使用dlg.dismiss()

信息

来自AsynTask.isCancelled()的文档

如果此任务在正常完成之前被取消,则返回true。如果对任务调用cancel(布尔值),则应定期从doInBackground(Object[])检查此方法返回的值,以尽快结束任务。

有一个全局引用供您使用,如下所示。

Dialog d;

//现在在您的AsyncTask 中

Class MyTask extends AsyncTask{
  onPostExecute(){
     if(d!=null){
       d.dismiss(); // do this to dismiss once task finished
     }
  }
          @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
       // keep doing this 
        if(this.isCancelled()){
            d.dismiss();
        }

相关内容

  • 没有找到相关文章

最新更新