这里我试图将一些数据从移动设备发送到服务器。首先,我必须登录服务器上的身份验证。之后我通过POST请求发送数据 我已经检查了这个相关的stackoverflow问题。 HttpClient 4.0.1 - how to release connection?
我已经逐一尝试了所有这些方法。
1.EntityUtils.consume(实体);
2.is.close();
response.getEntity()consumeContent(); //在那个consumeContent()中显示为Deprecated
post.abort();
以下是我在pastebin链接中的详细代码,请查看此内容。
以下是程序流程。
登录后,在调用帖子构思THIS方法之前。
最后调用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)
答案 0 :(得分:11)
当您使用指定任何ClientConnectionManager创建DefaultHttpClient时,它将默认创建BasicClientConnectionManager,如果您检查javadoc说:
单个连接的连接管理器。此连接管理器一次只维护一个活动连接。即使这个类是线程安全的,它也应该只由一个执行线程使用。 BasicClientConnManager将努力为具有相同路由的后续请求重用连接。但是,如果持久连接的路由与连接请求的路由不匹配,它将关闭现有连接并为给定路由打开它。如果已经分配了连接,则抛出IllegalStateException。
尝试根据您的需要设置PoolingClientConnectionManager自定义配置。看一个简单的例子:
PoolingClientConnectionManager cxMgr = new PoolingClientConnectionManager( SchemeRegistryFactory.createDefault());
cxMgr.setMaxTotal(100);
cxMgr.setDefaultMaxPerRoute(20);
这对HttpClient 4.2有效,因为该版本不推荐使用ThreadSafeClientConnManager。 希望这会有所帮助。