我在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
答案 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