当条件为真一段时间后调用方法

Call method when condition is true for certain length of time

我想创建一个方法,如果 state_i = 1 持续 time 秒,调用方法 alert_box(),其中时间是之前用户选择的值(以秒为单位)。

我不确定我是否应该使用 handler.postDelayed 或计时器或 while 循环来实现此方法或其他方法?

目的是在用户闭眼一段时间后显示一个警告框。

谢谢

eye_tracking方法

      private void eye_tracking(Face face) {
            float l = face.getIsLeftEyeOpenProbability();
            float r = face.getIsRightEyeOpenProbability();

            if (l > THRESHOLD || r > THRESHOLD) {
                state_i = 0;
                Log.i(TAG, "onUpdate: Open Eyes Detected");
            } else {
                state_i = 1;
                Log.i(TAG, "onUpdate: Closed Eyes Detected");
             
              //If state_i = 1 for *time* seconds, call method alert_box();

            }

由于 eye_tracking() 被连续调用,我们可以利用它来发挥我们的优势。我们将存储最后一次眼睛切换状态(即打开和现在关闭)的时间。然后在 eye_tracking() 中,我们将在每次看到闭眼时检查时间是否已过去 1000 毫秒,在这种情况下,然后我们可以调用我们的函数。每当眼睛睁开时,我们将在它们闭上后再次开始循环。

示例代码:

boolean firstTime = true;
long lastLowToHighState = 0;
private void eye_tracking(Face face) {
    float l = face.getIsLeftEyeOpenProbability();
    float r = face.getIsRightEyeOpenProbability();

    if (l > THRESHOLD || r > THRESHOLD) {
        state_i = 0;
        firstTime = true;
        Log.i(TAG, "onUpdate: Open Eyes Detected");
    } else {
        if (state_i == 0) {
            lastLowToHighState = SystemClock.elapsedRealtime();
        } else if (firstTime && SystemClock.elapsedRealtime() - lastLowToHighState > 1000) {
            // Used to prevent the function from continously firing
            lastLowToHighState = SystemClock.elapsedRealtime();
            firstTime = false;
            
            // Call Your Method Here
        }
        state_i = 1;
        Log.i(TAG, "onUpdate: Closed Eyes Detected");
    }
}