3

我正在尝试制作一个只能在两次调用之间存在一定时间延迟(比如 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
}

任何帮助都是极好的!阿迪特

4

9 回答 9

13

您可以以毫秒为单位保持时间,并检查当前时间是否大于或等于上一次时间 + 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));
    }
}
于 2013-03-12T12:05:55.747 回答
5

如果代码在您的主线程上运行,Thread.sleep(5000)则不是一种选择。那么最简单的方法是:

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

    previous = now;
    // do something
}
于 2013-03-12T12:25:59.407 回答
0

使用静态字段,该字段保存上次执行的日期时间,并在执行之前根据此时间戳检查当前日期时间。

于 2013-03-12T12:06:58.233 回答
0

我不会为您编写代码,但如果您考虑一下,这并不难。您要确保自上次函数调用后 5 秒后未调用它。让我们把它分成几部分。

1) 获取当前时间 2) 与在调用之间保持其值的存储时间进行比较。3) 如果不到 5 秒,则不做任何事情 4) 否则存储新值并做一些事情。

于 2013-03-12T12:07:13.083 回答
0

一个问题是您必须为每个用户设置一个会话级计时器。这可能是相当大的开销,具体取决于您拥有多少同时用户。

对于一个用户来说很容易:根据要求启动计时器。这是区分用户的问题。您的服务现在是有状态的,这通常是一件坏事。你放弃了幂等性。

您还可以在数据库中维护状态。不用担心电话;检查持久性操作以确保它们不会过于频繁地发生。

我不清楚您是要在任何人调用该方法后将所有用户排除五秒钟,还是在第一次调用该方法后阻止每个用户再次调用该方法五秒钟。

这听起来像是吞吐量杀手。我会重新考虑这个设计。

于 2013-03-12T12:07:30.623 回答
0

我从未在 Android 中进行过编码。但是,如果 Android 有线程(很可能,它确实有)。然后在这个函数中让线程休眠 5 秒,这意味着即使它被调用,它也不会继续执行,直到经过 5 秒

public void doSomething()
{
  Thread.sleep(5000);  // Please find the corresponding Android method
}
于 2013-03-12T12:09:42.873 回答
0

makedoSomethin()作为私有方法。

公开另一个函数,比如exposedDoSomething()。

public void exposeDoSomething(){

   // Add to a queue

}

在一个单独的线程中,每 5 分钟读取一次队列并调用doSomethin()

于 2013-03-12T12:11:20.437 回答
0

也许 TimerTask 会帮助你,更多细节在这里:

TimerTask|Android 开发者

例子:

    private TimerTask tiemrTast= new TimerTask() {

    @Override
    public void run() {


    }
};

然后使用这个方法:public void scheduleAtFixedRate (TimerTask task, long delay, long period)

于 2013-03-12T12:15:25.987 回答
0

您可以使用 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);
}
于 2013-03-12T12:36:22.383 回答