SingleClientConnManager 的无效使用在 Android 2.2,2.3 中发生,但在 4.1 中没有

Posted

技术标签:

【中文标题】SingleClientConnManager 的无效使用在 Android 2.2,2.3 中发生,但在 4.1 中没有【英文标题】:Invalid use of SingleClientConnManager occurs in Android 2.2,2.3 but not in 4.1 【发布时间】:2012-09-23 16:35:04 【问题描述】:

我已经在 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 上运行此异常时没有引发此异常?

【问题讨论】:

你的 android:targetSdkVersion 在清单中设置为什么? 我的 minSdk 是 8,targetSdk 是 15,我的 maxSdk 是 16 【参考方案1】:

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

如果您想跨多个线程使用HttpClient,请使用ThreadSafeClientConnManager

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

【讨论】:

以上是关于SingleClientConnManager 的无效使用在 Android 2.2,2.3 中发生,但在 4.1 中没有的主要内容,如果未能解决你的问题,请参考以下文章

关于光的反射和折射的例子?

既是3的倍数又是5的倍数都有哪些

一个三位数既是3的倍数,又是5的倍数。这样的三位数最小是啥

数组的创建,及数组的方法

cnn中的步长的目的和重要性是啥

物质的运动