znq*_*znq 5 java android connection-pooling httpclient thread-safety
我使用ThreadSafeClientConnManager来管理客户端连接池,因为我的应用程序有多个线程,它们同时连接到网络服务器。
抽象示例代码:
HttpClient httpClient;
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
httpclient = new DefaultHttpClient(conMgr, parameters);
Run Code Online (Sandbox Code Playgroud)
现在让我们说这个线程正在下载一个大文件,但是我的应用程序的用户正在切换到另一个活动/屏幕。因此该文件是不必要的,我想中止此下载连接。
在ThreadSafeClientConnManager我找到了这个方法:
public ClientConnectionRequest requestConnection (HttpRoute route, Object state)
返回一个新的 ClientConnectionRequest,从中可以获得一个 ManagedClientConnection 或者可以中止请求。
到目前为止,我一直在使用:
HttpGet httpRequest = new HttpGet(URL_TO_FILE);
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
[...]
Run Code Online (Sandbox Code Playgroud)
现在据我所知,我必须使用:
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
}
}
Run Code Online (Sandbox Code Playgroud)
使用 pooling 或 keepalive 时,中止的连接无法返回到池中,必须将其关闭。旧版本中存在一个错误,即连接保持活动状态并且会扰乱下一个请求。我认为这一切都是固定的。
| 归档时间: |
|
| 查看次数: |
5078 次 |
| 最近记录: |