我正在使用AsyncTask
初始化AndroidHttpClient
并在doInBackground()
中执行POST请求。我希望用户能够通过按后退按钮取消请求。 AsyncTask
有一个cancel()
方法,它只更改isCancelled()
的布尔返回值,然后在调用doInBackground()
之前等待onCancelled()
完成。这意味着AsyncTask
将其留给doInBackground()
方法,以持续检查任务是否已被取消(使用isCancelled()
)。如果已取消,doInBackground()
应提前过早返回。我遇到的问题是doInBackground()
中99%的工作线程执行停止:
HttpResponse response = httpClient.execute(request[0]);
因为此同步函数调用封装了请求的网络方面。如何在中途取消请求?
我正在考虑尝试在请求期间更改超时时间,但这似乎线程不安全。
我也在考虑覆盖AsyncTask
的{{1}}方法,这可能效果更好。
有什么建议吗?
答案 0 :(得分:19)
使用AndroidHttpClient API中止请求的正确方法是在传递给abort()
的请求对象上调用httpClient.execute()
。这将导致execute()
调用抛出IOException
,并且请求的isAborted()
调用开始返回true。 abort()
调用在AbortableHttpRequest
接口中定义,基本上所有有趣的请求类都实现(HttpGet
,HttpPost
等)。
AsyncTask.cancel(true)
不会取消请求,因为AndroidHttpClient.execute()
不会阻塞Thread.interrupt()
将执行任何操作停止(线程不等待加入另一个线程,等待互斥,或睡觉)。 Thread.interrupt()
不会阻止阻止I / O.
在我的测试中,调用httpClient.close()
或httpClient.getConnectionManager().shutdown()
无法阻止当前正在执行的请求,但我没有深入研究以尝试找出原因。
答案 1 :(得分:10)
httpclient.getConnectionManager().shutdown();
答案 2 :(得分:2)
调用HttpPost
或HttpGet
的{{1}}方法。您可以中止抛出(我忘记哪个特定)异常的请求。如果您使用abort()
,则需要设置ClientConnectionManager
,否则后续请求将会挂起。连接保持活动问题一直存在至少4.1.1。
答案 3 :(得分:-1)
实际上AsyncTask.cancel(boolean interruptIfRunning)
可以使用true
作为终止线程的参数来调用。