我使用ThreadSafeClientConnManager来管理客户端连接池,因为我的应用程序具有多个线程,这些线程同时连接到Web服务器。

抽象示例代码:

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

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

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);呢?

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

最佳答案

您只需要调用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
        }
     }

使用池或keepalive时,中止的连接无法返回到池中,必须将其关闭。在较旧的版本中存在一个错误,该错误使连接保持 Activity 状态,并弄乱了下一个请求。我认为这是固定的。

07-24 09:44
查看更多