如何解决 Android 中的错误“BasicClientConnManager 无效使用:确保在分配另一个连接之前释放连接”?

2024-03-04

在这里,我尝试将一些数据从移动设备发布到服务器。为此,我首先必须登录服务器进行身份验证。然后在我通过 POST 请求发送数据之后 我已经检查了这个相关的 stackoverflow 问题。HttpClient 4.0.1 - 如何释放连接? https://stackoverflow.com/questions/4775618/httpclient-4-0-1-how-to-release-connection

这些方法我都一一尝试过。

1.EntityUtils.consume(实体);

2.is.close();

  1. response.getEntity().consumeContent(); // 其中,consumContent() 显示已被弃用

  2. post.abort();

这是我在 Pastebin 链接中的详细代码,请检查。

以下是程序流程。

  1. 首次登录称为在这里检查我的登录请求 http://pastebin.com/idiNfnYD

  2. 登录后和发布想法之前THIS http://pastebin.com/bVsz7i50方法被调用。

  3. 最后发表想法 http://pastebin.com/10aKhzme方法被调用。

    但 logcat 显示错误:

    java.lang.IllegalStateException:BasicClientConnManager 的使用无效:连接仍然分配。

    确保在分配另一个连接之前释放该连接

W/System.err( 2217): java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
W/System.err( 2217): Make sure to release the connection before allocating another one.
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:161)
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.conn.BasicClientConnectionManager$1.getConnection(BasicClientConnectionManager.java:138)
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:455)
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:902)
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:801)
W/System.err( 2217):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:780)
W/System.err( 2217):  at com.rahul.cheerfoolz.api.util.postData(util.java:436)
W/System.err( 2217):  at com.rahul.cheerfoolz.postidea.idea.post_myidea_edit$Post_Idea.doInBackground(post_myidea_edit.java:354)
W/System.err( 2217):  at com.rahul.cheerfoolz.postidea.idea.post_myidea_edit$Post_Idea.doInBackground(post_myidea_edit.java:1)
W/System.err( 2217):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
W/System.err( 2217):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
W/System.err( 2217):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
W/System.err( 2217):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
W/System.err( 2217):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
W/System.err( 2217):  at java.lang.Thread.run(Thread.java:1019)

当您创建一个 DefaultHttpClient 并指定任何 ClientConnectionManager 时,它将默认创建一个基本客户端连接管理器 http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/BasicClientConnectionManager.html如果你检查 javadoc 说:

用于单个连接的连接管理器。该连接管理器一次仅维护一个活动连接。尽管此类是线程安全的,但它只能由一个执行线程使用。 BasicClientConnManager 将努力重用具有相同路由的后续请求的连接。但是,如果持久连接的路由与连接请求的路由不匹配,它将关闭现有连接并为给定路由打开它。如果连接已被分配,则抛出 IllegalStateException。

尝试设置一个池化客户端连接管理器 http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingClientConnectionManager.html可根据您的需求进行自定义配置。看一个简单的例子:

PoolingClientConnectionManager cxMgr = new PoolingClientConnectionManager( SchemeRegistryFactory.createDefault());
cxMgr.setMaxTotal(100);
cxMgr.setDefaultMaxPerRoute(20);

这对于 HttpClient 4.2 有效,因为该版本已弃用 ThreadSafeClientConnManager。 希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决 Android 中的错误“BasicClientConnManager 无效使用:确保在分配另一个连接之前释放连接”? 的相关文章

随机推荐