我在我的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) 等方法吗?
答案 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的开发者之一,但我最近开始使用它,这是一个很棒的项目。