2012-09-23 1 views
0

J'ai cherché Google à propos de cette exception spécifique et plusieurs résultats ont fait surface, mais je n'ai pas vu une réponse à la question que j'ai. Je actuellement accès à une API sur un serveur de la manière suivante:L'utilisation incorrecte de SingleClientConnManager se produit dans Android 2.2,2.3 mais pas dans 4.1

// 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()) 

Et bien sûr, le code ci-dessus n'est pas exactement le même code que je utilise. Toutes les tâches de blocage de l'interface utilisateur sont effectuées sur un thread distinct à l'aide de AsyncTask.

Lorsque ce code est exécuté pour la première fois, tout va bien. Ensuite, nous exécutons à nouveau le code et l'exception suivante apparaît, mais seulement dans Android 2.2 et 2.3 (je ne l'ai pas testé sur 3.0 ou 4.0):

Invalid use of SingleClientConnManager: connection still allocated 

Maintenant, l'une des meilleures réponses à cette question peut être trouvé ici: Exception using HttpRequest.execute(): Invalid use of SingleClientConnManager: connection still allocated, que je n'ai pas essayé mais avant cela, je me demande pourquoi cette exception n'est pas levée quand je cours cela sur Android 4.1?

+1

Quelle est votre 'Android: targetSdkVersion' mis dans le manifeste? – CommonsWare

+0

Mon minSdk est 8, targetSdk est 15 et mon maxSdk est 16 –

Répondre

2

Le comportement de AsyncTask changé sur Android 3.2: si votre targetSdkVersion est 13 ou plus, votre AsyncTasks partagera un fil unique de fondpar défaut, et une seule tâche sera exécutée à la fois. Sinon, votre AsyncTasks utilisera un pool de threads et pourra fonctionner en parallèle. Comme HttpClient n'est pas thread-safe par défaut, c'est pourquoi vous rencontrez une différence de comportement. Si vous souhaitez utiliser HttpClient sur plusieurs threads, utilisez ThreadSafeClientConnManager.

Pour en savoir plus sur le changement de comportement AsyncTask: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

+0

Ah, merci. Comme toujours, très utile. Merci Mark! –

Questions connexes