Quiero poder llamar al siguiente método después de un retraso especificado. En el objetivo c había algo como:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
¿Hay un equivalente de este método en Android con Java? Por ejemplo, necesito poder llamar a un método después de 5 segundos.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
alHandler
.import android.os.handler
No pude usar ninguna de las otras respuestas en mi caso. Utilicé el temporizador nativo de Java en su lugar.
fuente
Nota: Esta respuesta se dio cuando la pregunta no especificaba Android como contexto. Para obtener una respuesta específica al hilo de la interfaz de usuario de Android, consulte aquí.
Parece que la API de Mac OS permite que el hilo actual continúe y programa la tarea para que se ejecute de forma asincrónica. En Java, el
java.util.concurrent
paquete proporciona la función equivalente . No estoy seguro de qué limitaciones podría imponer Android.fuente
ScheduledFuture<?>
devuelta porworker.schedule()
y llame a sucancel(boolean)
método.ScheduledExecutorService
.Para ejecutar algo en el subproceso de la interfaz de usuario después de 5 segundos:
fuente
puedes usar Handler dentro de UIThread:
fuente
Gracias por todas las excelentes respuestas, encontré la solución que mejor se adapta a mis necesidades.
fuente
1. Usando
Handler
2. Usando TimerTask
O incluso más corto
O más corto sería
3. Usando
Executors
1. Usando
Handler
2. Usando
Timer
3. Usando
ScheduledExecutorService
fuente
How to call a method after a delay in Android
. Así que me concentré en eso. Al punto. De lo contrario, Java Leaks es un gran tema para entender por separado para los desarrolladores.Ver esta demostración:
fuente
Si tiene que usar el controlador, pero está en otro hilo, puede usarlo
runonuithread
para ejecutarlo en el hilo de la interfaz de usuario. Esto lo salvará de excepciones lanzadas pidiendo llamarLooper.Prepare()
Parece bastante desordenado, pero esta es una de las formas.
fuente
Prefiero usar el
View.postDelayed()
método, código simple a continuación:fuente
Aquí está mi solución más corta:
fuente
fuente
Si está utilizando Android Studio 3.0 y superior, puede usar expresiones lambda. El método
callMyMethod()
se llama después de 2 segundos:En caso de que necesite cancelar la ejecución demorada, use esto:
fuente
Sugiero el temporizador , le permite programar un método para que se llame en un intervalo muy específico. Esto no bloqueará su interfaz de usuario y mantendrá su aplicación resonante mientras se ejecuta el método.
La otra opción, es wait (); método, esto bloqueará el hilo actual durante el período de tiempo especificado. Esto hará que su interfaz de usuario deje de responder si hace esto en el hilo de la interfaz de usuario.
fuente
Para un retraso de publicación de identificador de línea simple, puede hacer lo siguiente:
espero que esto ayude
fuente
Puede usar esto para la solución más simple:
De lo contrario, a continuación puede haber otra solución limpia y útil:
fuente
Puede hacerlo mucho más limpio utilizando las expresiones lambda recién introducidas:
fuente
Así que hay algunas cosas a tener en cuenta aquí, ya que hay muchas maneras de desollar a este gato. Aunque todas las respuestas ya han sido seleccionadas y elegidas. Creo que es importante que esto se revise con las pautas de codificación adecuadas para evitar que alguien vaya en la dirección incorrecta solo por la "respuesta simple seleccionada por la mayoría".
Primero, analicemos la respuesta simple Publicada diferida que es la respuesta seleccionada ganadora en general en este hilo.
Un par de cosas a tener en cuenta. Después de la demora posterior, puede encontrar fugas de memoria, objetos muertos, ciclos de vida que se han ido y más. Por lo tanto, manejarlo correctamente también es importante. Puedes hacer esto de dos maneras.
Por el bien del desarrollo moderno, suministraré en KOTLIN
Aquí hay un ejemplo simple de usar el hilo de la interfaz de usuario en una devolución de llamada y confirmar que su actividad todavía está viva y bien cuando golpea su devolución de llamada.
Sin embargo, esto aún no es perfecto, ya que no hay razón para cancelar su devolución de llamada si la actividad ha desaparecido. así que una mejor manera sería mantener una referencia y eliminar sus devoluciones de llamada como esta.
y, por supuesto, manejar la limpieza en onPause para que no toque la devolución de llamada.
Ahora que hemos hablado a través de lo obvio, hablemos de una opción más limpia con las rutinas modernas y kotlin :). Si aún no los está utilizando, realmente se los está perdiendo.
o si desea hacer siempre un inicio de UI en ese método, simplemente puede hacer:
Por supuesto, al igual que PostDelayed, debe asegurarse de manejar la cancelación para que pueda hacer las verificaciones de actividad después de la llamada de retraso o puede cancelarla en onPause al igual que la otra ruta.
// manejar la limpieza
Si coloca el inicio (UI) en la firma del método, el trabajo puede asignarse en la línea de código de llamada.
así que la moraleja de la historia es estar seguro con sus acciones retrasadas, asegurarse de eliminar sus devoluciones de llamada o cancelar sus trabajos y, por supuesto, confirmar que tiene el ciclo de vida correcto para tocar elementos en su devolución de llamada demorada completa. The Coroutines también ofrece acciones cancelables.
También vale la pena señalar que normalmente debe manejar las diversas excepciones que pueden venir con las corutinas. Por ejemplo, una cancelación, una excepción, un tiempo de espera, lo que decida usar. Aquí hay un ejemplo más avanzado si realmente decide comenzar a utilizar corutinas.
fuente
Creé un método más simple para llamar a esto.
Para usarlo, solo llame al:
.CallWithDelay(5000, this, "DoSomething");
fuente
performSelector
. Esta es la mejor manera de hacerlo.Debajo de uno funciona cuando llegas,
fuente
Usando Kotlin, podemos lograr haciendo lo siguiente
fuente
Es muy fácil usar el
CountDownTimer
. Para más detalles https://developer.android.com/reference/android/os/CountDownTimer.htmlfuente
Si usa RxAndroid, el manejo de hilos y errores se vuelve mucho más fácil. El siguiente código se ejecuta después de un retraso
fuente
todos parecen olvidar limpiar el controlador antes de publicar un nuevo ejecutable o mensaje en él. De lo contrario, podrían acumularse y causar un mal comportamiento.
fuente
Aquí hay otra forma complicada: no arrojará excepciones cuando los elementos de la IU de cambio ejecutable.
Puedes llamar a la animación así:
La animación se puede adjuntar a cualquier vista.
fuente
Aquí está la respuesta en Kotlin, vagos, vagos:
fuente
Me gustan las cosas más limpias: aquí está mi implementación, código en línea para usar dentro de su método
fuente
Una solución adecuada en Android:
fuente
Solución similar pero mucho más limpia para usar
Escribe esta función fuera de la clase
Uso:
fuente
do
es un método incorporado, así que tenemos que usar `para usarlo como nombre de variabledo
después de 3 segundos de retrasoEn Android, podemos escribir a continuación el código kotlin para retrasar la ejecución de cualquier función
fuente