如何在Android中正确杀死AsyncTask线程?

时间:2013-02-07 16:27:32

标签: android multithreading android-asynctask

我在我的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) 正在执行时,如何检查任务是否被取消? 我可以在DefaultHttpClient中覆盖 onProgressChanged(int progress) 等方法吗?

3 个答案:

答案 0 :(得分:1)

  

我想实现一个允许用户取消当前功能的功能   AsyncTack并在当前任务花费太多时间时启动一个新的。

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

之后
HttpResponse httpResponse = httpClient.execute(httpPost);

您可以检查是否已取消

if(!isCanceled()){

}

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

   if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
      myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
    else {
      myTask.execute();
    }

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我实际上完全避免使用AsyncTask。 AsyncTasks容易出现内存泄漏,并且与Activity生命周期关系很差,因此您最终会遇到麻烦。

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