2010-06-22 5 views
3

dans mon application android j'ai un ui-update-thread qui garde toutes mes vues à jour.comment redémarrer un fil dans Android?

protected Thread UIUpdateThread = new Thread() 
{ 
@Override 
public void run() 
{ 
    while(true) 
    { 
    query_some_data_from_service(); // gets some "fresh" data from a service 
    UIUpdateHandler.sendEmptyMessage(0); // will update all ui elements with the new values 
    sleep(1234); 
    } 
} 
}; 

je commence à ce fil dans onCreate() avec

UIUpdateThread.start(); 

et tout fonctionne très bien :) quand je quitte l'activité (par exemple parce que je passe à une autre activité) j'appelle

UIUpdateThread.interrupt(); 

dans onStop() pour empêcher le thread de s'exécuter tout le temps. Si je ne fais pas cela, il continuerait à fonctionner même si je ferme l'application!?!? !!

problème est: comment ramener ce fil à la vie lors du retour d'une autre activité à celui-ci? run() ne fonctionne pas, en appelant le début initial() dans une autre méthode comme onResume() bloque l'application.

je l'ai déjà essayé beaucoup de choses, mais rien ne semble fonctionner :(

Répondre

6

La réponse d'Atmocreation est la bonne ... en supposant que votre implémentation soit une bonne idée en premier lieu. D'abord, le fil que vous montrez ici court brièvement et se termine immédiatement, vous n'avez donc pas besoin d'appeler le interrupt() pour l'arrêter. Dans ce cas, vous préférerez probablement passer à un AsyncTask plutôt qu'à votre propre thread et gestionnaire, car vous aurez besoin de moins de code et pourrez profiter du pool de threads de AsyncTask.

Si votre vrai thread n'est pas ce que vous montrez ici, mais une sorte de boucle infinie, c'est une mauvaise idée en général. Ne créez jamais de boucles occupées, en particulier sur Android. Très probablement, il existe une meilleure solution pour votre problème, peut-être un qui permettrait d'éviter le besoin de interrupt() ainsi.

+0

J'ai découpé presque tout le corps du fil car il ne semblait pas pertinent à des fins de démonstration. le thread "original" comporte une boucle sans fin, interrogeant certaines données d'un service dans chaque tour. un gestionnaire est alors chargé d'afficher réellement les données récupérées par le thread. puisque ce thread ne tourne plus sur le retour à cette activité, mon interface utilisateur ne reçoit plus de mises à jour. :(c'est pourquoi je dois recommencer le fil de nouveau ... – xenonite

+0

a résolu ceci - voir ma réponse – xenonite

+0

Un temporisateur est une meilleure option pour de telles tâches, particulièrement sur une plate-forme embarquée. Les boucles occupées sur un serveur sont une chose, mais sur un téléphone avec une batterie itsy-bitsy, le système d'exploitation peut gérer les tâches de planification à des intervalles réguliers beaucoup mieux. – Nate

2

en Java normal (et je pense que cela vaut pour Android aussi), un thread-objet ne peut pas être ramené à la vie une fois a été arrêté.

3

vous ne pouvez Thread.start appelé() une fois par thread. Plusieurs appels pour commencer() va lancer des exceptions que je suis sûr que vous avez remarqué.

Cela semble être une utilisation étrange Pourquoi avez-vous un thread en cours d'exécution pour mettre à jour votre interface utilisateur? Le thread principal de l'application Android est le thread UI et toutes les mises à jour de l'interface utilisateur doivent être effectuées sur ce thread.

Mise à jour:

Ensuite, vous avez fonctionner en arrière. Votre service devrait indiquer à votre application quand mettre à jour. Si vous le faites de cette façon, vous n'avez pas besoin d'un thread en cours d'exécution dans votre application et votre problème sera résolu. Vous pouvez utiliser le modèle ResultsReceiver qui vous permet de lier une activité à votre service et permet au service d'envoyer des résultats à votre activité. Et chaque fois que onCreate exécute votre activité, vous pouvez simplement vous reconnecter au service. Consultez le Google I/O 2010 app pour un exemple.

+0

mon application propose un service et ce fil interroge régulièrement ce service pour les mises à jour sur les données. – xenonite

+0

a mis à jour ma réponse. –