Ceci est plus difficile que de simplement tuer un fil. Vous pouvez appeler interrupt() sur le thread, mais le thread devra vérifier son statut d'interruption périodiquement et s'auto-terminer.
Deuxièmement, vous ne voulez pas démarrer un thread immédiatement sur un utilisateur qui tape.Vous allez rapidement submerger le système avec la fonte du fil. Implémentez une période d'attente de 100 à 200 millisecondes avant d'effectuer la recherche afin de pouvoir être raisonnablement certain que l'utilisateur a fini de taper. Le serveur de Google peut gérer la charge, mais le combiné ne pourra pas le faire.
EDIT: pour développer mon premier point, les threads peuvent être difficiles à annuler. Dans ce cas, le thread de répartition des événements doit indiquer au thread en cours d'exécution qu'il doit s'arrêter. Vous pouvez utiliser la fonctionnalité interrupt
intégrée dans les threads, mais elle a tendance à être sensible, comme indiqué par this article. Au lieu de cela, je voudrais simplement une variable boolean
qui peut être définie sur cancelled
par un thread externe. L'astuce (comme montré dans ce lien) sera que vous aurez besoin de vérifier périodiquement si le thread a été annulé, et si c'est le cas, vous devrez annuler manuellement.
Le prochain problème que vous rencontrerez est si un appel Web a déjà été fait à un serveur externe. Il bloquera dans ce fil jusqu'à ce qu'il revienne et le fil ne sera pas capable de se tuer. Cela pourrait prendre plusieurs secondes. Alors jouons-en - si un utilisateur tape un caractère et que le délai expire pour une raison quelconque et qu'un appel Web est effectué, l'utilisateur tape un autre caractère où le délai expire et un autre appel Web est effectué ? Si vos appels Web prennent 5 secondes, le premier thread continuera à s'exécuter, même si le thread d'envoi d'événement l'annule, pendant au moins 5 secondes. Vous avez maintenant deux threads faisant des appels Web.
Maintenant, développez cela. Que faire si un utilisateur fait cela et fait 4 ou 5 threads? C'est là que vous surchargez les ressources de votre téléphone. Je ne vous dis pas de ne pas poursuivre dans cette voie, en essayant simplement de souligner les problèmes potentiels que pose le territoire.
Ce n'est pas quelque chose qui devrait arriver dans un appareil mobile. Vraisemblablement vous êtes sur 3g et pas de wifi et cela pourrait prendre un temps long pour même 1 résultat de recherche. Vous devez mettre en cache les résultats de recherche de toutes les combinaisons possibles que l'utilisateur pourrait taper. C'est insensé. Selon les données, vous voudrez probablement simplement obtenir toutes les données à la fois au démarrage, puis les rechercher localement en utilisant la saisie semi-automatique comme mentionné ci-dessous. Si vos données sont des pages Web, n'y pensez même pas. – Falmarri
Les données recherchées pour une liste une liste de mots. Il renvoie, au plus, 25 mots. Lorsque vous tapez 'w', le service Web demande des mots commençant par 'w'. Si vous tapez 'wi', le service Web demande des mots commençant par 'wi'. Ce que je voudrais accomplir, c'est que si l'appel de service Web pour 'w' est toujours actif lorsque l'utilisateur tape 'i', il l'annule et tente l'appel de service Web pour 'wi'. En outre, j'ai placé un sommeil de 2 secondes avant que le service Web soit appelé; donc si l'utilisateur tape 'w' puis 'wi' dans les 2 secondes, aucune bande passante n'a été utilisée car le premier appel n'est jamais sorti. – Andrew
Les appels de service Web se produisent dans les threads; Donc, en arrêtant l'appel de service Web, je veux dire en réalité d'arrêter le fil qui le contient. – Andrew