在android中取消Http连接

时间:2011-09-03 07:48:12

标签: java android httpclient

我正在使用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下载文件的代码,我想取消连接(可能是用户选择的)什么是关闭连接的优雅方式。我找到了两种方法,两种都取消了下载。

  1. 关闭inputsteram,input.close();导致IOException。
  2. 中止HttpGet对象,get.abort()导致SocketException。
  3. 我试过捕捉,所以没有错误,但没有抛出异常, 有没有办法取消或中止连接?

    正确的方法是什么?

4 个答案:

答案 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,通常是因为它已经正常完成;否则