5

在这里,我试图将一些数据从移动设备发布到服务器。为此,首先我必须登录服务器进行身份验证。然后在我通过 POST 请求发送数据后,我检查了这个相关的 stackoverflow 问题。HttpClient 4.0.1 - 如何释放连接?

我已经一一尝试了所有这些方法。

1.EntityUtils.consume(实体);

2.is.close();

  1. response.getEntity().consumeContent(); //其中的consumeContent() 显示为已弃用

  2. post.abort();

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

以下是程序流程。

  1. 第一次登录称为 检查这里我的登录请求

  2. 在登录之后和发布想法之前调用此方法

  3. 最后调用post idea方法。

    但 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)
4

1 回答 1

11

当您创建一个 DefaultHttpClient 并指定任何 ClientConnectionManager 时,它将默认创建一个BasicClientConnectionManager并且如果您检查 javadoc 说:

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

尝试根据您的需要设置具有自定义配置的PoolingClientConnectionManager 。看一个简单的例子:

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

这对 HttpClient 4.2 有效,因为该版本不推荐使用 ThreadSafeClientConnManager。希望这可以帮助。

于 2012-12-07T12:59:58.593 回答