5

我正在使用ThreadSafeClientConnManager来管理客户端连接池,因为我的应用程序有多个线程,它们同时连接到网络服务器。

抽象示例代码:

HttpClient httpClient;
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
httpclient = new DefaultHttpClient(conMgr, parameters);

现在让我们说这个线程正在下载一个大文件,但是我的应用程序的用户正在切换到另一个活动/屏幕。因此该文件是不必要的,我想中止这个下载连接。

ThreadSafeClientConnManager我发现了这个方法:

public ClientConnectionRequest requestConnection (HttpRoute route, Object state) 返回一个新的 ClientConnectionRequest,可以从中获取 ManagedClientConnection 或者可以中止请求

到目前为止,我一直在使用:

HttpGet httpRequest = new HttpGet(URL_TO_FILE);
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
[...]

现在据我了解,我必须使用:

httpclient.getConnectionManager().requestConnection(HttpRoute route, Object state);

这就是我卡住的地方。我假设对于我可以使用的路线new HttpRoute(new HttpHost("10.0.0.1"))或我的服务器是什么,但是要输入什么Object state

第二,只要我有ClientConnectionManager我就可以打电话getConnection(long timeout, TimeUnit tunit)HttpGet httpRequest = new HttpGet(URL_TO_FILE);但是从那里开始,我如何像以前一样执行我的HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);

我已经浏览了文档并尝试了很多不同的东西,但我无法获得有效的解决方案。因此,任何建议和/或代码示例都非常受欢迎。

4

1 回答 1

5

你只需要打电话就httpRequest.abort()可以关闭连接。

对于大文件,您必须有一个循环处理数据。您可以检查取消状态并从中中止,

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        while (instream.read(buf) >= 0) {
            if (cancelled)
               httpRequest.abort();
            // Process the file
        }
     }

当使用 pooling 或 keepalive 时,中止的连接不能返回到池中,必须关闭。旧版本中存在一个错误,即连接保持活动状态,并且会弄乱下一个请求。我认为这一切都已解决。

于 2009-10-14T12:20:32.843 回答