首页 > 解决方案 > 条件为真一段时间后调用方法

问题描述

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

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

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

谢谢

眼动追踪法

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

            }

标签: javaandroidtimerandroid-handler

解决方案


由于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");
    }
}

推荐阅读