如何取消Android http请求?

时间:2011-08-21 19:30:23

标签: android http android-asynctask

我正在使用AsyncTask初始化AndroidHttpClient并在doInBackground()中执行POST请求。我希望用户能够通过按后退按钮取消请求。 AsyncTask有一个cancel()方法,它只更改isCancelled()的布尔返回值,然后在调用doInBackground()之前等待onCancelled()完成。这意味着AsyncTask将其留给doInBackground()方法,以持续检查任务是否已被取消(使用isCancelled())。如果已取消,doInBackground()应提前过早返回。我遇到的问题是doInBackground()中99%的工作线程执行停止:

HttpResponse response = httpClient.execute(request[0]);

因为此同步函数调用封装了请求的网络方面。如何在中途取消请求?

我正在考虑尝试在请求期间更改超时时间,但这似乎线程不安全。

我也在考虑覆盖AsyncTask的{​​{1}}方法,这可能效果更好。

有什么建议吗?

4 个答案:

答案 0 :(得分:19)

使用AndroidHttpClient API中止请求的正确方法是在传递给abort()的请求对象上调用httpClient.execute()。这将导致execute()调用抛出IOException,并且请求的isAborted()调用开始返回true。 abort()调用在AbortableHttpRequest接口中定义,基本上所有有趣的请求类都实现(HttpGetHttpPost等)。

AsyncTask.cancel(true)不会取消请求,因为AndroidHttpClient.execute()不会阻塞Thread.interrupt()将执行任何操作停止(线程不等待加入另一个线程,等待互斥,或睡觉)。 Thread.interrupt()不会阻止阻止I / O.

在我的测试中,调用httpClient.close()httpClient.getConnectionManager().shutdown()无法阻止当前正在执行的请求,但我没有深入研究以尝试找出原因。

答案 1 :(得分:10)

httpclient.getConnectionManager().shutdown();

答案 2 :(得分:2)

调用HttpPostHttpGet的{​​{1}}方法。您可以中止抛出(我忘记哪个特定)异常的请求。如果您使用abort(),则需要设置ClientConnectionManager,否则后续请求将会挂起。连接保持活动问题一直存在至少4.1.1。

答案 3 :(得分:-1)

实际上AsyncTask.cancel(boolean interruptIfRunning)可以使用true作为终止线程的参数来调用。