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

现在,可以在此处找到此问题的最佳答案之一:Exception using HttpRequest.execute(): Invalid use of SingleClientConnManager: connection still assigned,我没有尝试过,但在此之前,我想知道为什么这个异常不是当我在 Android 4.1 上运行它时被抛出?

4

1 回答 1

2

AsyncTask在 Android 3.2上改变的行为:如果你targetSdkVersion是 13 或更高,你AsyncTasks将默认共享一个后台线程,并且一次只运行一个任务。否则,您AsyncTasks将使用线程池并且可以并行运行。由于HttpClient默认情况下不是线程安全的,这就是您遇到行为差异的原因。

如果要HttpClient跨多个线程使用,请使用ThreadSafeClientConnManager.

For more on the AsyncTask behavior change: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

于 2012-09-23T18:35:59.567 回答