2011-05-27 17 views
40
private void startGameTimeElapseThread(){ 
    new Thread(new Runnable() { 
     Date d = new Date(); 
     public void run() { 
      while (gameOn){ 
       Log.d(TAG,""+d.getTime()+" "+gameStatus.getLastTimeUpdated()); 

       postInvalidate(795, 150, 1024, 300); 
       try { 
        synchronized (this) { 
         wait(1000); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        Log.d(TAG, "Waiting didnt work!!"); 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
} 

Aquí quería hacer que la llamada sea "Log.d" y "postInvalidate" cada segundo. Pero cuando lo miro desde LogCat parece que el bucle se ejecuta más rápido de lo que quiero. ¿Por qué este bucle no espera 1000ms?Cómo "esperar" un hilo en Android

A continuación se muestra la salida en LogCat. Entonces puedes ver que no está durmiendo por un segundo en absoluto. Solía ​​Thread.sleep así (después de sugerir)

05-27 11:40:10.060: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535 
05-27 11:40:10.070: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535 
05-27 11:40:10.232: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535 
05-27 11:40:10.250: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535 
05-27 11:40:10.310: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535 
05-27 11:40:10.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535 
05-27 11:40:10.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535 
05-27 11:40:10.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535 
05-27 11:40:10.593: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535 
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535 
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535 
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535 
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535 
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535 
05-27 11:40:11.260: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535 
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535 
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535 
05-27 11:40:11.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535 
05-27 11:40:11.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535 
05-27 11:40:11.520: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535 
05-27 11:40:11.551: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535 
05-27 11:40:11.712: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535 
05-27 11:40:11.881: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535 
05-27 11:40:12.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535 
05-27 11:40:12.211: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535 
05-27 11:40:12.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535 
05-27 11:40:12.242: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535 
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535 
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535 
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535 
05-27 11:40:12.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535 
05-27 11:40:12.311: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535 
05-27 11:40:12.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535 
05-27 11:40:12.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535 
05-27 11:40:12.442: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535 
05-27 11:40:12.471: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535 
05-27 11:40:12.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535 
05-27 11:40:12.553: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535 
05-27 11:40:12.671: DEBUG/NOPSA-P(4546): 1306496412639 1306496387535 
05-27 11:40:12.711: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535 
05-27 11:40:12.841: DEBUG/NOPSA-P(4546): 1306496412813 1306496387535 
05-27 11:40:12.891: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535 
05-27 11:40:13.001: DEBUG/NOPSA-P(4546): 1306496412983 1306496387535 
05-27 11:40:13.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535 
05-27 11:40:13.193: DEBUG/NOPSA-P(4546): 1306496413166 1306496387535 
05-27 11:40:13.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535 
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535 
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535 
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535 
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535 
05-27 11:40:13.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535 
05-27 11:40:13.271: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535 
05-27 11:40:13.321: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535 
05-27 11:40:13.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535 
05-27 11:40:13.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535 
05-27 11:40:13.431: DEBUG/NOPSA-P(4546): 1306496413405 1306496387535 
05-27 11:40:13.441: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535 
05-27 11:40:13.481: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535 
05-27 11:40:13.532: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535 

Esta es la última versión del código. gameOn es un booleano, por ahora es cierto.

private void startGameTimeElapseThread(){ 
    if (gameOn){ 
     new Thread(new Runnable() { 
      Date d = new Date(); 
      public void run() { 

        Log.d(TAG,""+d.getTime()+"ms "+d.getTime()/1000+"sec"); 
        postInvalidate(795, 150, 1024, 300); 
        android.os.SystemClock.sleep(1000); 
        startGameTimeElapseThread(); 

      } 
     }).start(); 
    } 
} 

La salida es

05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650761ms 1306497650sec 
05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650786ms 1306497650sec 
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650764ms 1306497650sec 
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650763ms 1306497650sec 
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650769ms 1306497650sec 
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650749ms 1306497650sec 
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650736ms 1306497650sec 
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650742ms 1306497650sec 
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650746ms 1306497650sec 
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650848ms 1306497650sec 
05-27 12:00:51.251: DEBUG/NOPSA-P(5098): 1306497650729ms 1306497650sec 
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms 1306497650sec 
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms 1306497650sec 
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650868ms 1306497650sec 
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650798ms 1306497650sec 
05-27 12:00:51.281: DEBUG/NOPSA-P(5098): 1306497650870ms 1306497650sec 
05-27 12:00:51.291: DEBUG/NOPSA-P(5098): 1306497651020ms 1306497651sec 
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651498ms 1306497651sec 
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651502ms 1306497651sec 
05-27 12:00:51.642: DEBUG/NOPSA-P(5098): 1306497651523ms 1306497651sec 
05-27 12:00:51.651: DEBUG/NOPSA-P(5098): 1306497651537ms 1306497651sec 
05-27 12:00:51.691: DEBUG/NOPSA-P(5098): 1306497651529ms 1306497651sec 
05-27 12:00:51.701: DEBUG/NOPSA-P(5098): 1306497651534ms 1306497651sec 
05-27 12:00:51.784: DEBUG/NOPSA-P(5098): 1306497651527ms 1306497651sec 
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651570ms 1306497651sec 
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651564ms 1306497651sec 
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651682ms 1306497651sec 
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651690ms 1306497651sec 
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651685ms 1306497651sec 
05-27 12:00:51.901: DEBUG/NOPSA-P(5098): 1306497651693ms 1306497651sec 
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651647ms 1306497651sec 
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651667ms 1306497651sec 
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651666ms 1306497651sec 
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651658ms 1306497651sec 
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651663ms 1306497651sec 
05-27 12:00:51.932: DEBUG/NOPSA-P(5098): 1306497651688ms 1306497651sec 
05-27 12:00:51.941: DEBUG/NOPSA-P(5098): 1306497651711ms 1306497651sec 
05-27 12:00:51.961: DEBUG/NOPSA-P(5098): 1306497651792ms 1306497651sec 
05-27 12:00:51.971: DEBUG/NOPSA-P(5098): 1306497651629ms 1306497651sec 
05-27 12:00:51.981: DEBUG/NOPSA-P(5098): 1306497651714ms 1306497651sec 
05-27 12:00:52.083: DEBUG/NOPSA-P(5098): 1306497652048ms 1306497652sec 

Respuesta

37

Se necesita el método de la clase Threadsleep.

public static void sleep (long time)

Hace que el hilo que envía este mensaje a dormir para el intervalo de tiempo determinado (dado en milisegundos). La precisión no está garantizada: el hilo puede dormir más o menos de lo solicitado.

Parámetros

time el tiempo para dormir en milisegundos.

+0

he añadido algunas salidas para mi código. ¿Puedes comprobarlo :) – dinesh707

+1

@ dinesh707: estás llamando a los métodos 'startGameTimeElapseThread()' varias veces, lo que crea un hilo por invocación. solo llama una vez y mira. –

+1

@ dinesh707: se puede registrar el resultado 'Thread.currentThread(). GetName()' y verificar usted mismo. –

37

No utilice wait(), use android.os.SystemClock.sleep(1000); o Thread.sleep(1000);. La principal diferencia entre ellos es el Thread.sleep() se puede interrumpir temprano - se le dirá, pero aún no es el segundo completo. La llamada a android.os no se activará temprano.

+1

agregué algunas salidas para mi código. Puede verificarlo :) – dinesh707

+0

El resultado no se alinea con sus instrucciones de registro tampoco, ya que la primera columna no está estacionaria (como creo que debería ser, dado que su código se cortó -d nunca se actualiza), ni estrictamente creciente. Sin embargo, las marcas de tiempo a la izquierda concuerdan contigo: no duermes un segundo completo. ¿Puedes actualizar tu código en esta publicación? – mah

+0

He actualizado el código más nuevo. – dinesh707

1

Escribir Thread.sleep(1000); que hará que el sueño hilo de 1000ms

18

Acabo de añadir esta línea tal y como aparece a continuación (si necesita un segundo retardo):

try{ Thread.sleep(1000); }catch(InterruptedException e){ } 

Me parece que el problema es necesario .

6

Puede probar esto es corta :)

SystemClock.sleep(7000); 

Se va a dormir durante 7 s vistazo a documentation

Cuestiones relacionadas