2010-12-03 5 views
13

Existe-t-il un moyen de vérifier si un objet Thread a déjà été appelé?Comment vérifier si un thread Android est en cours d'exécution

Je suis en train de si quelque chose comme:

if(rt.isAlive() == true) 
{ 
    Log.v(TAG, "START RECORD"); 
    rt.recording = true; 
} 
else 
{ 
    Log.v(TAG, "START THREAD/RECORD"); 

    rt.start(); 
} 

où il commencerait le fil si elle est pas déjà en cours d'exécution.

Répondre

14

En supposant que rt est Thread, vérifiez simplement rt.isAlive().

Vous pouvez également utiliser un indicateur booléen et le définir sur true avant de démarrer votre thread. Je préférerais réellement l'approche booléenne, donc il n'y a aucun moyen que le thread principal puisse démarrer l'autre thread deux fois - il peut y avoir un court délai jusqu'à ce que votre thread soit opérationnel, et si votre thread principal essaie de démarrer le enfiler deux fois successivement, il peut avoir un "faux" négatif sur rt.isAlive().

+0

isAlive ne cesse de renvoyer faux pour moi (je viens de mettre à jour ma réponse pour refléter mon code.) Utiliser le booléen devrait fonctionner bien que j'en utilise déjà un pour arrêter ma boucle Thread interne. Merci pour l'aide! – wajiw

+0

Oui, ça a marché. Fondamentalement, je n'initialise pas le Thread jusqu'à ce que l'action soit atteinte, alors je vérifie mon thread interne bool après cela. – wajiw

+0

Heureux de l'entendre fonctionner! La seule chose que je veux réitérer est que vous devez être conscient du délai entre le démarrage d'un thread et son exécution - si vous définissez un bool dans la méthode 'run' de votre thread, il y a une courte période où vous avez démarré le thread , mais le bool n'est pas encore défini sur true. C'est pourquoi je recommande de le placer dans le fil principal. – EboMike

1

Si vous avez appelé le démarrage et qu'il est en cours d'exécution, vous obtiendrez un IllegalThreadStateException. Attraper c'est un moyen de savoir.

Une autre option consiste à étendre Thread et à ajouter un booléen dans lequel vous gardez une trace de votre thread ou non. Vous pouvez remplacer la méthode start de Thread pour vérifier le booléen avant d'appeler super.start().

Vous devriez être très prudent lorsque vous utilisez des discussions sous Android. Assurez-vous de bien comprendre le cycle de vie du composant qui le démarre. En outre, vous devriez considérer certaines des classes auxiliaires comme Handler et AsyncTask au lieu de générer directement des threads.

+0

je ferais le booléen sur le thread principal, voir ma réponse. – EboMike

+0

Il y a beaucoup de façons d'accomplir cela. Je pense que nous sommes tous les deux d'accord que le fait de devoir le faire ne passe pas le test de reniflement. – elevine

+0

J'essaie juste d'apprendre à utiliser les Threads, ce qui est principalement ce dont il s'agit. J'utilise ma propre implémentation de Thread dans une classe séparée, donc utiliser Runnable ne fonctionnera pas, mais la méthode booléenne elle-même devrait l'être. Merci pour l'aide! – wajiw

5

Je l'ai utilisé cette approche avec succès:

if (mythread.getState() == Thead.State.NEW) 
    //then we have a brand new thread not started yet, lets start it 
    mythread.start(); 
else 
    //it is running already compensate 
Questions connexes