AsyncTask HttpPost execute échoue sur 3G, mais fonctionne sur Wifi

Je dois faire une publication Http de certaines chaînes dans un service Web. J'utilise KSoap.

@Override protected JSONObject doInBackground(JSONObject... params) { String result; HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. int timeoutConnection = 30000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 50000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); setupClient(httpclient); //HttpURLConnection httpclient = new HttpURLConnection(_url); Log.d(TAG, "Posting to ["+_url+"]"); HttpPost postdata = new HttpPost(_url); ...set up parameters ResponseHandler<String> handler = new BasicResponseHandler(); Calendar c = Calendar.getInstance(); long start = c.getTimeInMillis(); try { Log.d(TAG, "Starting post data call ["+_url+"]"); result = httpclient.execute(postdata,handler); c = Calendar.getInstance(); long total = c.getTimeInMillis() - start; Log.d(TAG, "Finished post data call ["+result+"] in ["+total+"] millis"); }catch(HttpResponseException e) { c = Calendar.getInstance(); long total = c.getTimeInMillis() - start; Log.e(TAG, "HttpResponseException: ["+total+"] millis. There was a problem communicating: " + e.getMessage()); return null; }catch (ClientProtocolException e) { Log.e(TAG, "ClientProtocolException There was a problem getting to the service: " + e.getMessage()); return null; } catch(SocketTimeoutException e){ Log.e(TAG, "SocketTimeoutException There was a problem connecting: " + e.getMessage()); return null; } catch (IOException e) { Log.e(TAG, "IOException There was a problem reading the data: " + e.getMessage()); return null; } catch(Exception e) { Log.e(TAG, "Exception An error occurred: " + e.toString()); return null; } httpclient.getConnectionManager().shutdown(); JSONObject resp = null; try { resp = new JSONObject(result); } catch (JSONException e) { resp = null; e.printStackTrace(); } Log.i(TAG, result.toString()); return resp; } 

Donc, cela fonctionne bien lorsque j'utilise Wifi pour me connecter, mais l'utilisation de la 3G échoue en 16 à 18 secondes en lançant une HttpResponseException.

  • Comment effacer le texte dans edittext
  • Comment obtenir la force du signal du service cellulaire dans Android?
  • Android: comment puis-je implémenter le manuel de l'utilisateur ou les instructions de l'application lors du démarrage de l'application
  • Existe-t-il un moyen de monter Android .img pour accéder au contenu AVD (Dispositif virtuel d'Android)?
  • Que signifient ces avertissements Logcat Android?
  • Bibliothèque Raphaeljs et SmartPhones
  • Je ne peux pas croire que c'est le DefaultHttpClient exécutant async qui est le problème, car il devrait également lancer l'erreur sur Wifi.

    MODIFIER
    Les services Web sont écrits en C # et utilisent les réponses JSON.

    Comme demandé ici, le logcat, donnant HttpResponseException en 18 secondes, comme je l'ai dit dans la question initiale:

     07-22 11:13:04.678: D/ProgressBar(26524): setProgress = 0<br/> 07-22 11:13:04.678: D/ProgressBar(26524): setProgress = 0, fromUser = false<br/> 07-22 11:13:04.678: D/ProgressBar(26524): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000<br/> 07-22 11:13:31.968: D/GpsLocation(26524): Got location<br/> 07-22 11:13:32.018: D/WebService(26524): BASE ADDRESS [http://[SERVICEURL]]<br/> 07-22 11:13:32.023: D/ProgressBar(26524): setProgress = 0<br/> 07-22 11:13:32.023: D/ProgressBar(26524): setProgress = 0, fromUser = false<br/> 07-22 11:13:32.023: D/ProgressBar(26524): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000<br/> 07-22 11:13:32.048: D/HttpPostWebServiceTask(26524): Posting to [http://[SERVICEURL]/Authentication/Authenticate]<br/> 07-22 11:13:32.053: D/HttpPostWebServiceTask(26524): Starting post data call [http://[SERVICEURL]/Authentication/Authenticate]<br/> 07-22 11:13:47.758: D/dalvikvm(26524): GC_CONCURRENT freed 258K, 17% free 8062K/9671K, paused 22ms+25ms, total 157ms<br/> **07-22 11:13:50.728: E/HttpPostWebServiceTask(26524): HttpResponseException: [18671] millis. There was a problem communicating: Gateway Timeout**<br/> 07-22 11:13:50.778: D/GOT RESPONSE(26524): NULL RESPONSE FROM SERVER<br/> 07-22 11:13:50.778: E/HttpPostWebServiceTask(26524): Error invoking command: null<br/> 07-22 11:13:50.783: W/System.err(26524): java.lang.NullPointerException<br/> 07-22 11:13:50.793: W/System.err(26524): at com.app.webservices.WebService.checkValidResponse(WebService.java:82)<br/> 07-22 11:13:50.793: W/System.err(26524): at com.app.webservices.WebService.access$0(WebService.java:76)<br/> 07-22 11:13:50.793: W/System.err(26524): at com.app.webservices.WebService$1.execute(WebService.java:120)<br/> 07-22 11:13:50.793: W/System.err(26524): at com.app.webservices.WebService$1.execute(WebService.java:1)<br/> 07-22 11:13:50.793: W/System.err(26524): at com.blm.android.webservice.HttpPostWebServiceTask.onPostExecute(HttpPostWebServiceTask.java:226)<br/> 07-22 11:13:50.793: W/System.err(26524): at com.blm.android.webservice.HttpPostWebServiceTask.onPostExecute(HttpPostWebServiceTask.java:1)<br/> 07-22 11:13:50.798: W/System.err(26524): at android.os.AsyncTask.finish(AsyncTask.java:631)<br/> 07-22 11:13:50.798: W/System.err(26524): at android.os.AsyncTask.access$600(AsyncTask.java:177)<br/> 07-22 11:13:50.803: W/System.err(26524): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)<br/> 07-22 11:13:50.803: W/System.err(26524): at android.os.Handler.dispatchMessage(Handler.java:99)<br/> 07-22 11:13:50.803: W/System.err(26524): at android.os.Looper.loop(Looper.java:137)<br/> 07-22 11:13:50.803: W/System.err(26524): at android.app.ActivityThread.main(ActivityThread.java:4947)<br/> 07-22 11:13:50.803: W/System.err(26524): at java.lang.reflect.Method.invokeNative(Native Method)<br/> 07-22 11:13:50.803: W/System.err(26524): at java.lang.reflect.Method.invoke(Method.java:511)<br/> 07-22 11:13:50.803: W/System.err(26524): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)<br/> 07-22 11:13:50.808: W/System.err(26524): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)<br/> 07-22 11:13:50.808: W/System.err(26524): at dalvik.system.NativeStart.main(Native Method)<br/> 

    END EDIT

    Est-ce la façon dont je devrais aller: http://www.vogella.com/articles/AndroidNetworking/article.html
    Alors, comment puis-je publier des entités de données utilisant cette méthode?

  • Android triple buffering - comportement attendu?
  • Le test bêta de Play Store ne fonctionne pas
  • Comment connecter un périphérique Android à PPTP VPN
  • SyncAdapter n'est pas appelé selon l'ordre des appels de configuration du compte
  • Comment créer un calendrier simple sur Android
  • EditText afterTextChanged ne fonctionne pas
  • 8 Solutions collect form web for “AsyncTask HttpPost execute échoue sur 3G, mais fonctionne sur Wifi”

    Vous pouvez essayer de vous connecter à votre serveur via le navigateur Web de votre téléphone pour voir si le problème se trouve dans votre application ou si le problème est un problème 3G qui résout / se connecte à l'adresse de votre serveur.

    Je suppose que vous ne pourrez pas vous connecter soit via un navigateur Web.

    Où est hébergé votre service Web? Devrait-il être accessible à partir d'un réseau externe? Vous pouvez vous connecter à votre serveur via wifi si le serveur est dans le même réseau.

    Vous devez effectuer le dépannage suivant:

    1. Confirmez que votre 3G fonctionne réellement. Ouvrez certains sites Web standard tels que Yahoo.
    2. Essayez de confirmer si votre réseau 3G peut réellement résoudre l'adresse que vous avez mentionnée. Sinon, vous pouvez essayer l'adresse IP directement. Si cette étape résout que votre DNS ne peut pas résoudre l'adresse correctement.
    3. Si les deux étapes ci-dessus échouent, redémarrez le périphérique, basculez le mode avion et réessayez. Parfois, le réseau 3G fonctionne avec réinitialisation.
    • Fondamentalement, dans une zone distante, la connectivité 3G n'est pas autant de vitesse que wifi. Essayez de vérifier que votre 3G vous fournit une séquence de connexion de données. Sinon, il ne parvient pas à "publier"

    • Ensuite, vous devez vérifier le délai de publication. Si vous prenez trop de temps pour poster, il est commun d'obtenir une erreur lors de la publication. Essayez de donner un délai maximum dans l'ordre pour publier des données énormes

    • Au lieu d'utiliser asyn, essayez d'utiliser Handlers ou classe de service pour télécharger quelque chose en arrière-plan.

    Puisque je suis débutant à Android, ce sont toutes les options dans mon esprit. Ce sera plus utile pour nous si quelque chose au-delà de cela.

    Ces erreurs surviennent souvent parce que le proxy n'a pas réussi à résoudre un nom de domaine dans une adresse.

    Ce problème est entièrement dû à la lente communication IP entre les ordinateurs de back-end, y compris le serveur Web. Seules les personnes qui ont configuré le réseau sur le site qui héberge le serveur Web peuvent résoudre ce problème.

    Il semble que vous avez le même problème que j'ai eu. Je passe beaucoup de temps à déboguer mon code, mais cette question résout tous mes problèmes-> Votre serveur est-il accessible depuis l'Internet public? Android Pourquoi l'envoi d'informations sur le serveur fonctionne-t-il uniquement avec WIFI?

    J'espère que vous exécutez des opérations sur le thread de l'interface utilisateur. Évitez cela

    J'ai eu parfois le même problème … pourquoi? Parce que le temps mort dans mon cas … dépend de la quantité d'octets téléchargez-vous … Parce que vous avez essayé un simple appel à ws? Est-ce que cela fonctionne? = >> time out.

    Pour Android 2.3 (Gingerbread) et plus haut, HttpUrlConnection est recommandé au lieu de HttpClient. Voir cette publication de l'équipe Android: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

    Il est possible que HttpClient soit bloqué sur le périphérique que vous utilisez et qu'il y a des problèmes d'envoi de données sur 3G.

    De plus, n'oubliez pas d'appeler cette méthode avant de faire une requête HTTP lors de l'utilisation de HttpURLConnection:

     private void disableConnectionReuseIfNecessary() { // HTTP connection reuse which was buggy pre-froyo if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { System.setProperty("http.keepAlive", "false"); } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.