在Android 2.2,2.3中无法使用SingleClientConnManager,但在4.1中没有

时间:2012-09-23 16:35:04

标签: android httpclient

我在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 allocated,我没有尝试过,但在此之前,我想知道为什么在Android上运行此异常时不会抛出此异常4.1

1 个答案:

答案 0 :(得分:2)

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

如果您想在多个主题中使用HttpClient,请使用ThreadSafeClientConnManager

有关AsyncTask行为更改的更多信息:http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html