¿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.
- Caracteres especiales de Android Sqlite
- Java.security.cert.CertPathValidatorException: Ancla de confianza para ruta de certificación no encontrada. Android 2.3
- RSA PKCS1-OAEP padding es compatible con bouncycastle?
- ¿Es posible cambiar el color del texto en una cadena a varios colores en Java?
- Android: ¿Cómo leer el archivo en bytes?
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
- StartActionMode devolver null
- Android Studio - OpenJDK 1.8 Vs. Oracle JDK
- Cómo agregar cookies (encabezado) en la vista de vídeo de Android para admitir las versiones anteriores de android atleast till jellybean
- Cómo obtener la fecha actual y el huso horario en formato de números
- Importar código fuente de Android en eclipse
- ¿Cómo puedo restar estas listas más rápido?
- Android - Google Spreadsheet Api
- Cómo probar la unidad android y burlarse de un método estático
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); }
- ¿Qué es android: contentDescription = "@ string / desc" en el xml de ImageView?
- ¿Cómo puedo cambiar el icono de actionbardrawertoggle, android?