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 中没有的主要内容,如果未能解决你的问题,请参考以下文章