Android Создание переменной, которая увеличивается один раз в секунду

В Java для Android я хочу создать переменную, которая увеличивается на 1 каждую секунду, другими словами, она считается, таким образом я могу проверить, была ли вызвана функция за последние 3 секунды, и если нет, я хочу это сделать что-то другое, чем если бы это было.

Есть ли встроенный способ сделать это? Я знаком с классом Timer, но, похоже, он не работает так, как мне хотелось бы... есть что-нибудь еще?

tl; dr: я хочу создать переменную, которая увеличивается на 1 каждую секунду, поэтому я могу использовать ее для обработки функции по-разному в зависимости от того, сколько времени прошло с момента ее последнего вызова. Есть простой способ сделать это? Если нет, то какой трудный способ сделать это?

3 ответа

Решение

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

private long timeLastCalled;

public void someMethod() {
    timeLastCalled = SystemClock.elapsedRealTime();
}

public boolean someMethodCalledRecently() {
    return (SystemClock.elapsedRealTime() - timeLastCalled) > 3000;
}
final int[] yourVariable = new int[1];
yourVariable[0] = 0;
updateVariableTimer = new CountDownTimer(howLongYouWantTimerToLast, 1000) {
    @Override
    public void onTick(long l) {
        yourVariable[0] += 1;
    }
}.start();

Или в качестве альтернативы сделать это с флагом вместо отслеживания подсчета переменных:

final boolean functionCalledRecently = false;
hasFunctionBeenCalledRecentlyTimer = new CountDownTimer(3000, 1000) {
    @Override
    public void onTick(long l) {
        functionCalledRecently = true;
    }
    @Override
    public void onFinish() {
        functionCalledRecently = false;         
    }
}.start();

Если вам просто нужно посмотреть, был ли метод вызван в течение последних 3 секунд, вы можете использовать Handler и Boolean флаг, чтобы подтвердить это.

private Handler mHandler = new Handler();
private boolean wasRun = false;

mHandler.postDelayed(new Runnable() {

    @Override
    public void run() {
        if(wasRun){               
           //whatever you want to do if run
        }
        mHandler.postDelayed(this, 3000);
    }
 },3000); //3 sec

В этом примере Handler будет работать с задержкой в ​​3 секунды. Каждый раз, когда он запускается, он проверяет, был ли ранее вызван другой метод, вычисляя if (wasRun). Таким образом, вы можете изменить то, что происходит, если метод был / не был вызван. Затем обработчик снова запустит iself с задержкой в ​​3 секунды. Все, что вам нужно сделать, это обновить флаг wasRun, чтобы он был истинным, если ваш метод был вызван, или ложным, если это не так.,

Другие вопросы по тегам