Cómo hacer que un programa Android 'espere'

Quiero hacer que mi programa se detenga por un cierto número de milisegundos, ¿cómo exactamente haría esto?

He encontrado maneras diferentes, como Thread.sleep( time ) , pero no creo que eso es lo que necesito. Sólo quiero tener mi código de pausa en una línea determinada para x milisegundos. Cualquier idea sería muy apreciada.

Este es el código original en C …

 extern void delay(UInt32 wait){ UInt32 ticks; UInt32 pause; ticks = TimGetTicks(); //use = ticks + (wait/4); pause = ticks + (wait); while(ticks < pause) ticks = TimGetTicks(); } 

Wait es una cantidad de milisegundos

Aceptar, en primer lugar, NUNCA implementar un retraso con un bucle de ocupado como lo estás haciendo. Puedo ver de donde viene eso – estoy adivinando que el piloto de la palma era un dispositivo del solo-proceso sin la función incorporada del sueño (), pero en un dispositivo del multi-proceso, un lazo ocupado como eso apenas trae el entero Procesador hasta las rodillas. Elimina la batería, impide que las tareas normales del sistema se ejecuten correctamente, ralentiza otros programas o los detiene por completo, hace que el dispositivo no responda, e incluso puede causar que se caliente en las manos.

La llamada que está buscando es Thread.sleep (). Tendrá que configurar para detectar cualquier excepción de interrupción que se produzca mientras duerme.

En segundo lugar, con interfaces de usuario basadas en eventos como Android (o prácticamente cualquier sistema GUI moderno), nunca se quiere dormir en el hilo de la interfaz de usuario. Esto también congelará todo el dispositivo y dará lugar a un accidente ANR (actividad no responde), como otros carteles han mencionado. Lo más importante, esos pequeños congelamientos arruinan totalmente la experiencia del usuario.

(Excepción: si está durmiendo por intervalos suficientemente cortos que el usuario probablemente no notará, puede salirse con la suya. 1/4 segundo probablemente esté bien, aunque puede hacer la aplicación janky dependiendo de la situación).

Desafortunadamente, no hay manera limpia y elegante de hacer lo que quieres si lo que estás haciendo es portar una aplicación basada en bucle a un sistema basado en eventos.

Dicho esto, el procedimiento adecuado es crear un controlador en su hilo de interfaz de usuario y enviar mensajes retrasados ​​a él. Los mensajes retrasados ​​"despertarán" su aplicación y la activarán para realizar lo que fuera a hacer después del retraso.

Algo como esto:

 View gameBoard; // the view containing the main part of the game int gameState = 0; // starting Handler myHandler; public void onCreate(Bundle oldState) { super.onCreate(oldState); ... gameBoard = findViewById(R.layout.gameboard); myHandler = new Handler(); ... } public void onResume() { super.onResume(); displayStartingScreen(); myHandler.postDelayed(new Runnable() { gotoState1(); }, 250); } private void gotoState1() { // It's now 1/4 second since onResume() was called displayNextScreen(); myHandler.postDelayed(new Runnable() { gotoState2(); }, 250); } ... 

Realmente no debe dormir el hilo de la interfaz de usuario como este, es probable que tenga su cierre de la aplicación con la excepción de ActivityNotResponding si lo hace.

Si desea retrasar algún código de ejecución durante un período de tiempo determinado, utilice un Runnable y un Handler como este:

 Runnable r = new Runnable() { @Override public void run(){ doSomething(); //<-- put your code in here. } }; Handler h = new Handler(); h.postDelayed(r, 1000); // <-- the "1000" is the delay time in miliseconds. 

De esta manera, su código aún se retrasa, pero no está "congelando" el hilo de la interfaz de usuario, lo que daría como resultado un rendimiento deficiente en el mejor de los casos, y la fuerza ANR cerraría en el peor de los casos.

Haga algo como lo siguiente. Aquí hay un enlace a la referencia , esto podría ser útil.

 final MyActivity myActivity = this; thread= new Thread(){ @Override public void run(){ try { synchronized(this){ wait(3000); } } catch(InterruptedException ex){ } // TODO } }; thread.start(); 

SystemClock.sleep (millis) es una función de utilidad muy similar a Thread.sleep (millis), pero ignora InterruptedException.

No está seguro de por qué desea que el programa se detenga. En caso de que desee realizar alguna tarea en segundo plano y utilizar los resultados, consulte AsyncTask . Tuve una pregunta similar hace un tiempo.

Creo que Thread.sleep (….) probablemente es lo que quieres, simplemente no lo haces correctamente. ¿Qué es exactamente lo que intenta hacer una pausa? Esperemos que no el hilo de interfaz de usuario? ¿Im que conjetura usted tiene cierto hilo de fondo que realiza algunas tareas en una cierta clase de intervalo? Si es así, Thread.sleep pondrá ese hilo particular en suspensión durante cierto tiempo, pero no suspenderá todos los hilos.

Parece que estás portando un juego.

Solo usa dormir como pensabas, debería funcionar.

 try { Thread.sleep(2000); //1000 milliseconds is one second. } catch (InterruptedException e) { e.printStackTrace(); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.