0

この特定の例外について Google を検索したところ、複数の結果が表示されましたが、質問に対する回答が見つかりませんでした。現在、次の方法で一部のサーバーの API にアクセスしています。

// Setup...
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();

nameValuePair.add(new BasicNameValuePair("key","value"));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
HttpResponse response = httpClient.execute(httpPost);
String results = EntityUtils.toString(response.getEntity())

もちろん、上記のコードは私が使用しているコードとまったく同じではありません。UI ブロック タスクは、AsyncTask を使用して別のスレッドで実行されます。

このコードが初めて実行されるときは、すべて問題ありません。次に、コードを再度実行すると、次の例外が表示されますが、これは Android 2.2 および 2.3 でのみ発生します (3.0 または 4.0 ではテストしていません)。

Invalid use of SingleClientConnManager: connection still allocated

さて、この質問に対する最も多い回答の 1 つがここにあります: Exception using HttpRequest.execute(): Invalid use of SingleClientConnManager: connection still allocated、試したことはありませんが、その前に、なぜこの例外が発生しないのか疑問に思っています。 Android 4.1でこれを実行するとスローされますか?

4

1 に答える 1

2

AsyncTaskAndroid 3.2での変更の動作:targetSdkVersionが13以上の場合、デフォルトで単一のAsyncTasksバックグラウンドスレッドを共有し、一度に1つのタスクのみが実行されます。それ以外の場合は、スレッドプールを使用し、並行して実行できます。デフォルトではスレッドセーフではないため、動作に違いが生じます。AsyncTasksHttpClient

HttpClient複数のスレッドで使用する場合は、を使用しますThreadSafeClientConnManager

AsyncTask動作の変更の詳細については、 http: //commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.htmlをご覧ください。

于 2012-09-23T18:35:59.567 に答える