java - 从 ThreadSafeClientConnManager 连接池取消/中止连接

标签 java android thread-safety connection-pooling httpclient

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

摘要示例代码:

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

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

ThreadSafeClientConnManager我找到了这个方法:

public 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")) 或者我的服务器是什么,但是要为 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 状态并且会扰乱下一个请求。我认为这一切都是固定的。

关于java - 从 ThreadSafeClientConnManager 连接池取消/中止连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565349/

相关文章:

java - 如何删除sqlite中的特定列及其引用列

java - 我可以在 java 中同步块(synchronized block)之外的共享字段上检查 null 吗?

c++ - 多个线程竞相将相同的数据设置为相同的值

java - Transport.send 不适用于 javax.mail 库

linux - java.lang.NoClassDefFoundError : com/tinkerpop/blueprints/impls/orient/OrientGraphFactory 错误

java - 无法将 2 个视频流合并到一个文件中

android - 如何从经纬度获取村名、区和街道

java.lang.NoSuchMethodError : org. apache.poi.util.POILogger.log(ILjava/lang/Object;Ljava/lang/Throwable;)V

java - 尝试加载文件时java中的空指针异常

objective-c - 我如何知道我是否正在 UI 线程上执行某些操作?