微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java-取消/中止来自ThreadSafeClientConnManager连接池的连接

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

抽象示例代码

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

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

ThreadSafeClientConnManager中,我发现此方法

公共ClientConnectionRequest requestConnection(HttpRoute路由,对象状态)
返回一个新的ClientConnectionRequest,可以从中获取ManagedClientConnection或中止该请求.

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

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

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

httpclient.getConnectionManager().requestConnection(HttpRoute路由,对象状态);

这就是我被困住的地方.我假设对于路由,我只能使用new HttpRoute(new HttpHost(“ 10.0.0.1”))或我的服务器是什么,但是在对象状态下应该输入什么呢?

其次,一旦有了ClientConnectionManager,我就可以调用getConnection(长时间超时,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时,中止的连接无法返回到池中,必须将其关闭.在较旧的版本中存在一个错误,该错误使连接保持活动状态,并弄乱了下一个请求.我认为这是固定的.

原文地址:https://www.jb51.cc/android/531424.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐