Comment arrêter HttpURLConnection connecter sur Android
- Je utiliser AsyncTask pour connecter un chemin url comme ci-dessous de code.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.left_list);
Button btn = (Button)findViewById(resid);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//how to stop connect
}
});
new Connecting().execute();
}
class Connecting extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
//do something
}
@Override
protected String doInBackground(String... aurl) {
try {
URL url = new URL(URLPath);
connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.connect();
is = connection.getInputStream();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String unused) {
super.onPostExecute(unused);
//access InputStream is
}
}
connexion peut passer beaucoup de temps à se connecter.
Pendant la connexion, je veux mettre le Bbutton btn est enfoncé pour arrêter la connexion se connecter.
Comment puis-je mettre dans setOnClickListener méthode?
pouvez-vous connexion d'appel.fermer sur cliquez sur le bouton?
la connexion peut être exploité sur le bouton cliquez sur. Mais comment appeler connexion fermer.
Je pense qu'il y est un défaut de la fonction close() disponible pour HttpURLconnection objets
la connexion peut être exploité sur le bouton cliquez sur. Mais comment appeler connexion fermer.
Je pense qu'il y est un défaut de la fonction close() disponible pour HttpURLconnection objets
OriginalL'auteur brian | 2012-09-12
Vous devez vous connecter pour publier un commentaire.
Placer le code qui utilise
HttpURLConnection
à l'intérieur d'unFuture
, que vous pouvez annuler à volonté. Vous pouvez également utiliser leFuture
's d'attente, car les délais d'attente dansHttpURLConnection
ne sont pas fiables.Définir un exécuteur testamentaire et de l'avenir au sein de votre réseau de classe:
Puis enveloppez votre code de mise en réseau à l'intérieur de la
Future
comme ceci:Lorsque vous souhaitez annuler, vous pouvez faire appel à partir de n'importe quel thread:
Si l'avenir expire ou est annulé, la connexion tâche peut continuer à bloquer sur un
HttpURLConnection
méthode, mais votre demande ne sera pas freiné. Vous devriez toujours fixer des délais d'attente sur le lien pour accélérer la libération des fils et des sockets réseau.Si le HttpURLConnection est en attente sur une lecture, cela ne fonctionne PAS. Je teste en ce moment et le fils ne jamais s'en aller après l'annuler. J'ai créé un test où le serveur cible a eu une erreur de mémoire insuffisante, il peut accepter des connexions, mais ne revient jamais. Le code ci-dessus n'est jamais en mesure d'annuler le fil.
Le pool de threads sont censés rester autour pour les réutiliser ultérieurement. C'est un détail d'implémentation de
ExecutorService
. La chose importante est queFuture.get
rapidement fois et le renvoie.Désolé, je ne suis pas en précisant les choses correctement. Quand j'ai suspendre ces fils, ils sont toujours à l'intérieur : SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int): non disponible [méthode native] et c'est après l'annuler(true);
href="http://stackoverflow.com/q/3590000/145173">les interruptions la connexion de la tâche. Parmi ses nombreux problèmes,
HttpURLConnection
semble ignorer l'interrompre. Heureusement, tant que votre application ne considère que l'Avenir est terminée (y compris la synchronisation ou d'être annulé), il ne peut ignorer l'languir tâche, sachant qu'il finira par s'en aller.OriginalL'auteur Edward Brey