Quiero hacer una pausa entre dos líneas de código. Permítanme explicar un poco:
-> el usuario hace clic en un botón (una tarjeta de hecho) y lo muestro cambiando el fondo de este botón:
thisbutton.setBackgroundResource(R.drawable.icon);
-> después de decir 1 segundo, necesito volver al estado anterior del botón volviendo a cambiar su fondo:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> He tratado de pausar el hilo entre estas dos líneas de código con:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Sin embargo, esto no funciona. ¿Tal vez es el proceso y no el hilo el que necesito pausar?
También he intentado (pero no funciona):
new Reminder(5);
Con este:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
¿Cómo puedo pausar / suspender el hilo o proceso?
android
process
multithreading
Hubert
fuente
fuente
(!conditionCheck()) {}
lo general se desalienta.Respuestas:
Una solución a este problema es usar el método Handler.postDelayed () . Algunos materiales de capacitación de Google sugieren la misma solución.
Sin embargo, algunos han señalado que la solución anterior causa una pérdida de memoria porque utiliza una clase interna y anónima no estática que implícitamente contiene una referencia a su clase externa, la actividad. Este es un problema cuando el contexto de actividad es recolección de basura.
Una solución más compleja que evita la pérdida de memoria subclases
Handler
yRunnable
con clases internas estáticas dentro de la actividad, ya que las clases internas estáticas no tienen una referencia implícita a su clase externa:Tenga en cuenta que
Runnable
utiliza una referencia débil a la actividad, que es necesaria en una clase estática que necesita acceso a la interfaz de usuario.fuente
final Button mynewbutton = mybutton;
y usarlomynewbutton
en el controlador y el ejecutable a partir de ahí.Puedes probar este es corto
ADVERTENCIA : Nunca, nunca, haga esto en un subproceso de interfaz de usuario.
Use esto para dormir, por ejemplo. hilo de fondo.
La solución completa para su problema será: Esta está disponible API 1
Sin crear tmp Handler. Además, esta solución es mejor que @tronman porque no conservamos la vista de Handler. Además, no tenemos problemas con el controlador creado en el subproceso incorrecto;)
Documentación
Código para postDelayed de la clase View:
fuente
OMG of course do this in background thread
es irrelevante, a menos que muestre CÓMO ponerlo en el hilo de fondo. En ese momento, descubrirá que tiene una respuesta más complicada que la respuesta ya aceptada. ¿Mencioné que se aceptó una solución mejor hace tres años? : PHandler + postRunnable
logra todo esto, en un solo paso. Sin la sobrecarga del sistema de crear un segundo hilo.Yo uso esto:
fuente
e.getLocalizedMessage()
supone que debe hacer?Handler/postDelayed
solución aceptada tiene dos ventajas: (1) evita la sobrecarga del sistema del segundo subproceso, (1) se ejecuta en el subproceso de la interfaz de usuario, por lo que puede realizar cambios en la interfaz de usuario sin causar una excepción.Probablemente no quieras hacerlo de esa manera. Al poner un código explícito
sleep()
en el controlador de eventos con el botón presionado, en realidad bloquearía toda la interfaz de usuario por un segundo. Una alternativa es utilizar algún tipo de temporizador de disparo único . Cree una TimerTask para volver a cambiar el color de fondo al color predeterminado y programarlo en el Timer.Otra posibilidad es usar un controlador . Hay un tutorial sobre alguien que cambió de usar un temporizador a usar un controlador.
Por cierto, no puede pausar un proceso. Un proceso Java (o Android) tiene al menos 1 subproceso, y solo puede dormir subprocesos.
fuente
Yo uso CountDownTime
fuente
Esto es lo que hice al final del día: funciona bien ahora:
fuente
Además de las respuestas del Sr. Yankowsky, también puede usar
postDelayed()
. Está disponible en cualquierView
(p. Ej., Su tarjeta) y requiere unRunnable
período de retraso. Se ejecutaRunnable
después de ese retraso.fuente
Este es mi ejemplo
Crear un Java Utils
fuente
O podrías usar:
que tiene la ventaja de no requerir envoltura
try ... catch
.fuente
Si usa Kotlin y corutinas , simplemente puede hacer
Y si necesita actualizar la interfaz de usuario
fuente
Sé que este es un hilo viejo, pero en la documentación de Android encontré una solución que funcionó muy bien para mí ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Espero que esto ayude a alguien...
fuente
Y para estar seguro de que se puede combinar con el método de "clase estática" como se describe en la respuesta de tronman
fuente