Dialog在AsyncTask超时时关闭

时间:2014-09-11 10:07:52

标签: android android-asynctask dialog timeout dismiss

我正在为网络连接启动 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 对话框始终在运行。 我怎样才能解雇

4 个答案:

答案 0 :(得分:2)

更容易的是在Handler代码中添加dialog.dismiss():

        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 );

非常感谢大家的帮助

答案 1 :(得分:1)

取消Asynctask时,她不会离开doInBackground ......

  

块引用   可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用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;
 }

答案 2 :(得分:1)

全局声明Dialog

Dialog dlg;

onPreExecute

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

doInBackground

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

onPostExecute的{​​{1}}中执行此操作

AyncTask

或者,如果您只是想在 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

<强>信息

来自AsynTask.isCancelled()

的文档
  

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

答案 3 :(得分:0)

为您提供一个全局参考对话框。

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();
        }