如何取消Android http请求?

Ted*_*ddy 14 android http android-asynctask

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

HttpResponse response = httpClient.execute(request[0]);
Run Code Online (Sandbox Code Playgroud)

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

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

我也在考虑覆盖AsyncTaskcancel()方法,它可以更好地工作.

有什么建议?

小智 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()无法阻止当前正在执行的请求,但我没有深入研究以试图找出原因.


Sam*_*iya 11

httpclient.getConnectionManager().shutdown();
Run Code Online (Sandbox Code Playgroud)

  • 这将关闭整个客户端,而不是单个请求 (2认同)