Android AsyncTask:停止执行调用web-service的任务

时间:2013-12-13 15:34:14

标签: java android web-services android-asynctask android-activity

我在这里寻找答案,但找不到我需要的东西。以下是我正在处理的场景:我有一个AsyncTask进行Web服务调用:

class getDataDetailTask extends AsyncTask<String, Void, DataDetail> {
    @Override
    protected DataDetail doInBackground(String... args) {
        return AppUtils.getDataDetails();
    }

    @Override
    protected void onCancelled(OutageDetail result) {
        .... // something goes here   
    }
}

因此,假设webservice调用通常会在30秒后超时(如果不成功)。现在,我不希望用户等待30秒才能发现呼叫已经超时,我希望它不会超过10秒。所以我创建了一个计时器来管理AsyncTask:

class checkDataTask implements Runnable {
    getDataDetailTask dataAsyncTask;
    Context context;

    public checkDataTask(getDataDetailTask asyncTask) {
        dataAsyncTask = asyncTask;
    }

    @Override
    public void run() {
        mHandler.postDelayed(runnable, 10);
    }

    Handler mHandler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (dataAsyncTask.getStatus() == Status.RUNNING
                    || dataAsyncTask.getStatus() == Status.PENDING) {
                dataAsyncTask.cancel(true);
            }
        }
    };
}

所有这些调用都是在Activity中的onCreate方法中设置的,如下所示:

    getDataDetailTask dataTask = new getDataDetailTask();
    dataTask.execute();
    checkDataTask check = new checkDataTask(dataTask);
    (new Thread(check)).start();

当AsyncTask发出cancel(true)方法时,正在调用onCancelled(Object)或[onCancelled()以获取早期的SDK版本)。我的问题是,在我的onCancelled电话中我应该怎么做才能“杀死”这个任务?

1 个答案:

答案 0 :(得分:0)

只需设置处理程序,即可在给定的时间段后取消AsyncTask

Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( check.getStatus() == AsyncTask.Status.RUNNING )
          check.cancel(true);
  }
}, 10000 );