3

我在我的 Android 项目中子类化了一个 AsyncTask。

我想实现一项功能,如果当前任务花费太多时间,则允许用户取消当前的 AsyncTack 并开始一个新的。

MyAsyncTask mat = new MyAsyncTask();

当用户单击取消按钮时,我将执行以下代码,然后开始一个新任务。

mat.cancel(true);

但是,我后来意识到,直到旧任务完成,新任务才会开始。旧的任务步骤仍在执行。

我在google上查看官方文档。看来我应该在doInBackGroud(Params... params)中调用以下语句。

if (isCancelled()) break;

问题是我发现下面的代码需要很长时间。

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);

但是如何在httpClient.execute(httpPost)执行时检查任务是否被取消?有没有像onProgressChanged(int progress)这样的方法可以在 DefaultHttpClient 中覆盖?

4

3 回答 3

1

我想实现一项功能,如果当前任务花费太多时间,则允许用户取消当前的 AsyncTack 并开始一个新的。

由于在旧任务完成之前无法启动新任务,因此您可以创建 Asyntask 的新实例。事实上,多次使用 AsyncTask 的实例是个坏主意。在你之后

HttpResponse httpResponse = httpClient.execute(httpPost);

你可以检查它是否被取消

if(!isCanceled()){

}

查看文档,线程规则下的最后一行。 正如评论指出的那样
更新。取决于您的平台,因此请在执行前检查平台版本。

   if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
      myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
    else {
      myTask.execute();
    }
于 2013-02-07T16:34:56.617 回答
1

您需要通过调用abort您的httpPost对象来中止您的请求。这将导致该execute方法立即返回并停止阻塞您的线程。

于 2013-02-07T16:36:07.943 回答
0

我实际上会完全避免使用 AsyncTask。AsyncTask 容易发生内存泄漏,并且与 Activity 生命周期的联系很差,因此您最终会给自己带来麻烦。

考虑使用RoboSpice,因为它不仅可以帮助您解决问题,而且可以避免 AsyncTasks 的问题,并且不必使用 HttpClient 手动编写内容。我不是 RoboSpice 的开发者之一,但我最近开始使用它,这是一个很棒的项目。

于 2013-02-07T17:01:31.330 回答