3

2つの呼び出しの間にある程度の時間遅延(たとえば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
}

どんな助けでも素晴らしいでしょう!Adit

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

Androidでコーディングしたことはありません。ただし、Androidにスレッドがある場合(ほとんどの場合、スレッドがあります)。次に、この関数内でスレッドを5秒間スリープします。つまり、呼び出されても、5秒が経過するまでスレッドは実行されません。

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

doSomethin()プライベート メソッドとして作成します。

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 に答える
0

最後の実行の日時を保存する静的フィールドを使用し、実行前にこのタイムスタンプに対して現在の日時を確認します。

于 2013-03-12T12:06:58.233 に答える
0

私はあなたのためにコードを書きませんが、これについて少し考えれば、それほど難しいことではありません。最後の関数呼び出しから 5 秒が経過する前に呼び出されないようにする必要があります。これをパーツに分けてみましょう。

1) 現在の時刻を取得する 2) 呼び出し間で値を保持する保存された時刻と比較します。3) 経過時間が 5 秒未満の場合は何もしないでください。 4) そうでない場合は、新しい値を保存して処理を行います。

于 2013-03-12T12:07:13.083 に答える
0

問題の 1 つは、ユーザーごとにセッション レベルのタイマーが必要になることです。これは、同時ユーザーの数によっては、かなりの量のオーバーヘッドになる可能性があります。

1 人のユーザーにとっては簡単です。要求に応じてタイマーを開始します。問題なのはユーザーを区別することです。サービスはステートフルになりましたが、これは通常悪いことです。あなたは冪等性を与えています。

データベースで状態を維持することもできます。通話について心配する必要はありません。永続的な操作をチェックして、頻繁に発生しないようにします。

メソッドが誰かによって呼び出されたら、すべてのユーザーを 5 秒間除外するつもりなのか、それとも最初に呼び出された後、すべてのユーザーが 5 秒間メソッドを再度呼び出せないようにするのか、私にはわかりません。

これはスループットキラーのように聞こえます。このデザインを再考したいと思います。

于 2013-03-12T12:07:30.623 に答える