Как создать функцию Java, которая когда-то была вызвана, не может быть вызвана снова, если не будет какой-то задержки?

Я пытаюсь сделать функцию, которая ТОЛЬКО может быть вызвана снова после некоторой задержки времени между двумя вызовами (скажем 5 секунд).

Мне нужна эта функциональность для приложения Android, которое я создаю. Поскольку возможно, что пользователь будет называть эту функцию слишком часто в течение нескольких секунд, это разрушит его опыт. Поэтому я отчаянно ищу ответ на этот вопрос.

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 } 

Любая помощь была бы потрясающей! штольня

Вы можете провести время в миллисекундах и проверить, превышает ли текущее время предыдущее время + 5 секунд. Если это так, выполните метод и замените предыдущее время на текущее время.

См. 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)); } } в 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)); } } 

Если код работает в основном потоке, Thread.sleep(5000) не является опцией. Самый простой способ пойти тогда будет:

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

Используйте статическое поле, которое сохраняет дату и время последнего выполнения и перед выполнением проверки текущего времени и времени на эту метку времени.

Я не буду писать код для вас, но если вы подумаете немного об этом, это не так сложно. Вы хотите убедиться, что он не вызывается до того, как прошло 5 секунд с момента последнего вызова функции. Давайте разделим это на части.

1) Получить текущее время 2) Сравнить с сохраненным временем, которое сохраняет значение между вызовами. 3) Если прошло менее 5 секунд, ничего не делайте. 4) В противном случае сохраните новое значение и сделайте что-нибудь.

Я никогда не кодировал в Android. Но если Android имеет потоки (что, скорее всего, так и есть). Затем в этой функции спящий поток в течение 5 секунд, это означает, что даже если он вызывается, он не будет выполняться дальше до тех пор, пока не пройдет 5 секунд

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

doSomethin() как частный метод.

Выставить другую функцию, например, protectedDoSomething ().

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

В отдельном потоке читайте очередь каждые 5 минут и вызывайте doSomethin()

Возможно, TimerTask поможет вам, подробнее здесь:

TimerTask | Разработчики Android

Пример:

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

И затем используйте этот метод: public void scheduleAtFixedRate (TimerTask task, long delay, long period)

Одна из проблем заключается в том, что для каждого пользователя должен быть таймер уровня сеанса. Это может быть достаточным количеством накладных расходов в зависимости от того, сколько одновременных пользователей у вас есть.

Это легко для одного пользователя: запустите таймер по запросу. Это различает пользователей, которые являются проблемой. Теперь ваш сервис является состоятельным, что обычно плохо. Вы отдаете идемпотентность.

Вы также можете сохранить состояние в базе данных. Не беспокойтесь о звонках; Проверьте постоянные операции, чтобы убедиться, что они не происходят слишком часто.

Мне непонятно, хотите ли вы исключить всех пользователей в течение пяти секунд после вызова метода кем угодно, или если каждый пользователь не может снова вызвать метод за пять секунд, как только он будет вызван в первый раз.

Это звучит как убийца с пропускной способностью. Я бы пересмотрел этот дизайн.

Вы должны попробовать thread.sleep:

 Thread.sleep(5000); 

Вы можете использовать метод hander.postDalayed для вызова метода для запуска после определенной задержки, вы можете использовать свой метод, что-то вроде этого

 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); }