Comment puis-je annuler un Android requête http?
Je suis en utilisant AsyncTask
à initalize AndroidHttpClient
et exécuter une requête POST en doInBackground()
. J'aimerais que l'utilisateur soit en mesure d'annuler la demande en appuyant sur le bouton retour. AsyncTask
a un cancel()
méthode qui ne change la valeur de retour boolean de isCancelled()
et puis attend doInBackground()
à terminer avant d'appeler onCancelled()
. Cela signifie que AsyncTask
laisse le doInBackground()
méthode de vérifier en permanence si la tâche a été annulée (à l'aide de isCancelled()
). Si elle a été annulée, doInBackground()
doit retourner prématurément prématurément. Le problème que je vais avoir, c'est que 99% de l'exécution du thread de travail dans doInBackground()
s'arrête sur:
HttpResponse response = httpClient.execute(request[0]);
parce que cet appel de fonction synchrone encapsule le réseau aspects de la demande. Comment puis-je annuler la demande à mi-chemin à travers?
J'envisage d'essayer de changer la durée du délai au moment de la demande, mais cela semble un thread dangereux.
J'envisage aussi primordial AsyncTask
's cancel()
méthode, qui peut fonctionner mieux.
Des suggestions?
OriginalL'auteur Teddy | 2011-08-21
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Samir Mangroliya
La façon correcte d'une demande l'annulation, avec la AndroidHttpClient API est d'appeler
abort()
sur l'objet de la requête que vous passez danshttpClient.execute()
. Ce sera la cause de laexecute()
appel à jeter unIOException
, et la demande deisAborted()
appel pour commencer à renvoyer true. Leabort()
appel est défini dans leAbortableHttpRequest
interface, qui, fondamentalement, l'ensemble de la demande intéressante classes implémentent (HttpGet
,HttpPost
, etc).AsyncTask.cancel(true)
ne pas annuler la demande, parce queAndroidHttpClient.execute()
ne pas bloquer d'une manière quiThread.interrupt()
fera tout pour l'arrêter (le thread n'est pas en attente pour joindre un autre thread, en attente sur un mutex, ou de dormir).Thread.interrupt()
n'arrête PAS de blocage I/O.Dans mes tests, appelant
httpClient.close()
ouhttpClient.getConnectionManager().shutdown()
ne fait rien pour arrêter le cours d'exécution demande, mais je n'ai pas de recherche en profondeur pour essayer de trouver pourquoi.La solution générale de l'appel d'abort() n'était pas suffisant pour moi. J'ai suivi ayblin solution et qui a finalement fonctionné pour moi. stackoverflow.com/questions/7007731/...
J'ai évité le
android.os.NetworkOnMainThreadException
en déplaçant mes appels àHttpGet.cancel()
sur un thread d'arrière-plan. Tellement ennuyeux. 🙁OriginalL'auteur Jeremy Penner
Appel
HttpPost
's ouHttpGet
'sabort()
méthode. Vous pouvez annuler la demande qui jette un (j'ai oublié lequel) exception à la règle. Si vous utilisez unClientConnectionManager
vous devrez définirSystem.setProperty("http.keepAlive", "false")
, sinon les demandes juste accrocher. La connexion de la garder vivante problème existe encore, tout le chemin jusqu'à au moins 4.1.1.OriginalL'auteur Noah Seidman
Fait
AsyncTask.cancel(boolean interruptIfRunning)
peut être appelée à l'aide detrue
en tant que paramètre à mettre fin à la discussion.Il tente seulement d'annuler la demande, il n'est pas garantie. Avec force la terminaison d'un thread est généralement une mauvaise idée, d'où ce comportement.
J'ai été en mesure de le faire et il m'abandonne. Mon approche utilise CloseableHttpClient et de ses classes. Checkout ma réponse ici: stackoverflow.com/questions/7007731/...
OriginalL'auteur Dave