【问题标题】:Call method when condition is true for certain length of time当条件为真一段时间后调用方法
【发布时间】:2021-01-11 19:32:11
【问题描述】:

我想创建一个方法,如果 state_i = 1 for time 秒,则调用方法 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();

            }

【问题讨论】:

  • eye_tracking() 的调用频率如何?
  • 我的活动一直在运行

标签: java android timer android-handler


【解决方案1】:

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

【讨论】:

  • 谢谢,我会检查并报告。
  • 非常欢迎,很高兴能为您提供帮助
  • 每次用户连续闭眼 1000 毫秒时都会调用我的函数,即如果闭眼 5 秒,我的函数将被调用 5 次。这是不可取的,因为会出现一个对话框,这意味着显示了 5 个对话框。有没有办法让我的函数运行直到重新打开眼睛,而不是每 1000 毫秒调用一次函数?谢谢
  • 哦,我明白你的意思了,我认为这是可取的行为。为了防止这种情况,您需要添加一个布尔值来检查弹出窗口是否出现。基于此,您将决定是否显示弹出窗口。检查更新的答案。
  • 非常欢迎,很高兴我能帮助你:-)
猜你喜欢
  • 2015-03-20
  • 2021-07-28
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多