2010-12-03 36 views
13

¿Hay alguna forma de comprobar si ya se ha invocado un objeto Thread en él?Cómo comprobar si se está ejecutando un Thread de Android

Estoy intentando así que algo como:

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

    rt.start(); 
} 

donde comenzaría el hilo si no está ya en ejecución.

Respuesta

14

Suponiendo que rt es un Thread, simplemente marque rt.isAlive().

Como alternativa, simplemente use un indicador booleano y configúrelo en verdadero justo antes de comenzar su hilo.

Preferiría en realidad el enfoque booleano, así que no hay forma de que el hilo principal pueda iniciar el otro hilo dos veces; puede haber un pequeño retraso hasta que el hilo esté funcionando y si el hilo principal intenta iniciar el hilo. Enhebrar dos veces en sucesión rápida, puede obtener un negativo "falso" en rt.isAlive().

+0

isAlive sigue volviendo falso de alguna manera (acabo de actualizar mi respuesta para reflejar mi código). Usar el booleano debería funcionar, ya que ya estoy usando uno para detener mi ciclo de subprocesos interno. ¡Gracias por la ayuda! – wajiw

+0

Sí que funcionó. Básicamente, no inicializo el subproceso hasta que se golpea la acción, luego verifico mi bool interno de subprocesos después de eso. – wajiw

+0

¡Me alegra oír que funcionó! Lo único que quiero reiterar es que debes tener en cuenta la demora entre iniciar un hilo y hacer que funcione; si configuras un bool en el método 'run' de tu Thread, hay un corto período de tiempo en el que comenzaste el hilo , pero el bool aún no está configurado como verdadero. Es por eso que recomiendo configurarlo en el hilo principal. – EboMike

1

Si llamaste para iniciarlo, y está en ejecución, obtendrás un IllegalThreadStateException. Atrapar esa es una forma de saber.

Otra opción es extender el subproceso y agregar un booleano donde realizar un seguimiento de si su subproceso se ha iniciado o no. Puede anular el método de inicio de Subproceso para verificar el booleano antes de llamar al super.start().

Sin embargo, debes tener mucho cuidado cuando uses hilos en Android. Asegúrese de comprender el ciclo de vida del componente que lo está iniciando. Además, debería considerar algunas de las clases auxiliares como Handler y AsyncTask en lugar de hilos de desove directos.

+0

que haría el booleano en el hilo principal, véase mi respuesta. – EboMike

+0

Hay muchas maneras de lograr esto. Creo que ambos estamos de acuerdo en que la necesidad de hacerlo no pasa la prueba de olfateo. – elevine

+0

Estoy tratando de aprender a usar los hilos, que es principalmente de lo que se trata. Estoy usando mi propia implementación de Thread en una clase separada, así que usar Runnable no funcionará, pero el método booleano sí mismo. ¡Gracias por la ayuda! – wajiw

5

he utilizado este método con éxito:

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 
Cuestiones relacionadas