¿Cómo crear una función Java que una vez llamado, no se puede llamar de nuevo a menos que haya algún retraso?

Estoy tratando de hacer una función que sólo se puede llamar de nuevo después de que hay una cierta cantidad de tiempo de retraso entre las dos llamadas, (Say 5 segundos).

Requiero esta funcionalidad para una aplicación de Android que estoy creando. Puesto que es posible que el usuario llamara a esa función con demasiada frecuencia dentro de unos segundos, destruiría su experiencia. Por lo tanto, estoy desesperadamente buscando una respuesta sobre esto.

public void doSomethin(){ //code here which makes sure that this function has not been called twice within the specified delay of 5 seconds //Some code here } 

¡Cualquier ayuda sería increíble! Adit

Puede mantener el tiempo en milisegundos y comprobar si la hora actual es mayor o igual que la hora anterior + 5 segundos. Si es así, ejecute el método y reemplace la hora anterior por la hora actual.

Vea System.currentTimeMillis ()

 public class FiveSeconds { private static Scanner scanner = new Scanner(System.in); private static long lastTime = 0; public static void main(String[] args) { String input = scanner.nextLine(); while(!input.equalsIgnoreCase("quit")){ if(isValidAction()){ System.out.println(input); lastTime = System.currentTimeMillis(); } else { System.out.println("You are not allowed to do this yet"); } input = scanner.nextLine(); } } private static boolean isValidAction(){ return(System.currentTimeMillis() > (lastTime + 5000)); } } 

Si el código se ejecuta en su subproceso principal, Thread.sleep(5000) no es una opción. La manera más fácil de ir entonces sería:

 private long previous = 0; public void doSomething() { long now = Calendar.getInstance().getTimeInMillis(); if (now - previous < 5000) return; previous = now; // do something } 

utilizar un campo estático, que guarda la fecha y hora de la última ejecución y antes de ejecutar comprobar la fecha y hora actual contra esta marca de tiempo.

No voy a escribir código para usted, pero si usted piensa un poco acerca de esto no es tan difícil. Desea asegurarse de que no se haya llamado antes de que transcurran 5 segundos desde la última llamada de función. Vamos a dividir esto en partes.

1) Obtener la hora actual 2) Comparar con el tiempo almacenado que mantiene el valor entre las llamadas. 3) Si ha pasado menos de 5 segundos no haga nada 4) De lo contrario, guarde el nuevo valor y haga cosas.

Nunca hice la codificación en Android. Pero si Android tiene hilos (lo que es más probable, lo hace). Entonces dentro de esta función el sueño de hilo durante 5 segundos, significa que a pesar de que se llama, no se ejecutará más hasta que pasen 5 segundos

 public void doSomething() { Thread.sleep(5000); // Please find the corresponding Android method } 

make doSomethin() como un método privado.

Exponga otra función, por ejemplo, exposureDoSomething ().

 public void exposeDoSomething(){ // Add to a queue } 

En un hilo separado, lea la cola cada 5 minutos y llame a doSomethin()

Tal vez un TimerTask le ayudará, más detalles aquí:

TimerTask | Desarrolladores de Android

Ejemplo:

  private TimerTask tiemrTast= new TimerTask() { @Override public void run() { } }; 

A continuación, utilice este método: public void scheduleAtFixedRate (TimerTask task, long delay, long period)

Un problema es que usted tendrá que tener un temporizador de nivel de sesión para cada usuario . Esto podría ser una buena cantidad de gastos generales dependiendo de cuántos usuarios simultáneos que tenga.

Es fácil para un usuario: iniciar un temporizador a petición. Es la distinción entre los usuarios que es el problema. Su servicio es ahora con estado, que es generalmente una cosa mala. Estás regalando idempotencia.

También puede mantener el estado en una base de datos. No te preocupes por las llamadas; compruebe las operaciones persistentes para asegurarse de que no ocurren con demasiada frecuencia.

No está claro si quiere excluir a todos los usuarios durante cinco segundos una vez que el método es llamado por alguien, o si a cada usuario se le impide llamar al método de nuevo durante cinco segundos una vez que se llame la primera vez.

Esto suena como un asesino del rendimiento. Yo reconsideraría este diseño.

Usted debe intentar thread.sleep:

 Thread.sleep(5000); 

puede utilizar hander.postDalayed método para llamar al método para ejecutar después de retraso específico puede utilizar su método algo como esto

 int delay=5000; int k; int iDelayTimeInMiliSeconds=2000; for( k=0;k<arrBatch.size();k++) { delay=delay+iDelayTimeInMiliSeconds; callAllDocumentList(arrBatch.get(k),k,delay); } public void callAllDocumentList(final String strInvoiceId,final int count,int delay) { mHandler.postDelayed(new Runnable() { @Override public void run() { // call your function here that you want to call after specific delay //getOrderDetails(strInvoiceId,count,true); } }, delay); } 
  • Utilizar Enhanced For Loop Syntax está generando resultados más lentos
  • ¿Cómo puedo enviar un mensaje a un dispositivo usando C2DM desde un servidor que ha sido autenticado con OAuth2?
  • Convertir objeto complejo de Java en Json
  • Java: Diferentes resultados al decodificar cadena base64 con java.util.Base64 vs android.util.Base64
  • ¿Cómo puedo calcular el hash SHA-256 de una cadena en Android?
  • Java.lang.IllegalArgumentException: No se puede tener un viewTypeCount <1
  • Leer y escribir datos con GSON
  • Cómo configurar OnClickListener para ScrollView?
  • ¿Cómo puedo instanciar un objeto java utilizando JNI (Delphi)
  • ¿Cuál es la mejor manera de enviar una imagen desde un dispositivo Android a un servidor para su procesamiento y enviar los resultados?
  • Obtener JSONObject de JSONArray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.