我正在使用org.apache.http
而且我有这段代码:
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse resp = client.execute(get);
HttpEntity entity = resp.getEntity();
InputStream input = entity.getContent();
...
//Read the bytes from input stream
这是我用来通过Http下载文件的代码,我想取消连接(可能是用户选择的)什么是关闭连接的优雅方式。我找到了两种方法,两种都取消了下载。
我试过捕捉,所以没有错误,但没有抛出异常, 有没有办法取消或中止连接?
正确的方法是什么?
答案 0 :(得分:3)
执行此操作的正确方法是将FIN
值发送到服务器端。
在Android中你怎么没有选择参与这个级别,所以你可以自己使用C实现,或者使用你在问题中提到的方法之一。
答案 1 :(得分:3)
在我看来,使用HttpUriRequest#about
是正确的方法。这将导致基础连接立即终止并从连接池中逐出。较新版本的HttpClient(4.2和更新版本)拦截由用户过早请求终止引起的SocketExceptions。问题是谷歌基于一个非常过时的版本(pre-beta1)发布了HttpClient的分支。如果您不能或不愿意使用较新版本的HttpClient,您唯一的选择就是在代码中捕获并丢弃SocketException。
答案 2 :(得分:2)
使用此
client.getConnectionManager().closeExpiredConnections();
client.getConnectionManager().shutdown();
现在您可以决定在代码中将这两行写在哪里。它将使用您创建的DefaultHttpClient对象关闭连接。
如果这有助于您,请告诉我。
答案 3 :(得分:2)
如果要中断连接,请尝试取消该任务:
task.cancel(true);
这将取消任务及其中运行的线程。
检查以供参考:
public final boolean cancel(boolean mayInterruptIfRunning)
自:API Level 3 尝试取消执行此任务。如果任务已经完成,已经取消或由于某些其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行。如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断。
调用此方法将导致在doInBackground(Object [])返回后在UI线程上调用onCancelled(Object)。调用此方法可确保永远不会调用onPostExecute(Object)。调用此方法后,应定期从doInBackground(Object [])检查isCancelled()返回的值,以尽早完成任务。
参数 如果执行此任务的线程应该被中断,则mayInterruptIfRunning为true;否则,允许完成正在进行的任务。 返回 如果任务无法取消,则为false,通常是因为它已经正常完成;否则