5

ここでは、モバイルからサーバーにデータを POST しようとしています。そのためには、まずサーバーで認証のためにログインする必要があります。次に、POSTリクエストを介してデータを送信した後、この関連するstackoverflowの質問を確認しました。HttpClient 4.0.1 - 接続を解放するには?

私はこれらすべての方法を1つずつ試しました。

1.EntityUtils.consume(エンティティ);

2.is.close();

  1. response.getEntity().consumeContent(); //その中で、consumeContent() は非推奨であることが示されています

  2. post.abort();

これがペーストビンのリンクにある私の詳細なコードです。これを確認してください。

プログラムの流れはこちら。

  1. 最初のログインは呼び出されます ここを 確認してください MY LOGIN REQUEST

  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

ClientConnectionManager を指定して DefaultHttpClient を作成すると、デフォルトでBasicClientConnectionManagerが作成されます。javadocを確認すると、次のように表示されます。

単一接続用の接続マネージャー。この接続マネージャーは、一度に 1 つのアクティブな接続のみを維持します。このクラスはスレッドセーフですが、1 つの実行スレッドのみで使用する必要があります。BasicClientConnManager は、同じルートを持つ後続のリクエストに対して接続を再利用しようとします。ただし、永続的な接続のルートが接続要求のルートと一致しない場合は、既存の接続を閉じて、指定されたルートに対して開きます。接続がすでに割り当てられている場合は、IllegalStateException がスローされます。

必要に応じてカスタム構成でPoolingClientConnectionManagerを設定してみてください。簡単な例を見てください:

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

ThreadSafeClientConnManager は HttpClient 4.2 で非推奨になったため、これは HttpClient 4.2 で有効です。お役に立てれば。

于 2012-12-07T12:59:58.593 に答える