【问题标题】:Android Things GPIO interrupt not triggered until after wait() timeoutAndroid Things GPIO 中断直到 wait() 超时后才触发
【发布时间】:2018-03-20 18:04:22
【问题描述】:

我已经完成了这个基本设置,interrupt 已从外部注册为 GPIO 引脚的边沿触发回调:

public class Foo {

  private static final Object notifier = new Object();

  public static GpioCallback interrupt = pin -> {
    synchronized (notifier) {
      notifier.notifyAll();
    }
    return true;
  };

  public void waitForInterrupt() {

    try {
      synchronized (notifier) {
        notifier.wait(5000);
      }
      Log.d("FOO", "Done.");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

wait() 的超时时间总是用完,即使发生中断。只有这样才会执行回调。

有没有办法在回调发生时立即执行,如果有,怎么做?

【问题讨论】:

  • 很高兴听到您解决了问题!但是,在 Stackoveflow 上,我们不会将解决方案编辑为问题。请恢复您的编辑并将您的解决方案作为答案发布,然后在自我回答计时器到期后的几天内返回并接受该答案。这是系统认为您的问题已解决的唯一方法(没有关闭)。
  • 我能问一下你为什么使用等待/通知吗?这不是你通常必须在 Android 编程中使用的东西。
  • 请将您的编辑添加为源代码更改的答案。
  • 完成。感谢您的提醒。 @JamesPuderer我正在集成一个SPI协议,其中一个中断引脚用于发出“准备好接收新消息”的信号(除其他外),因此我需要确保在发送下一个中断之前发生中断。有没有比wait()更好的方法?
  • 这可以通过更简单的方式完成,无需同步。但是你没有分享足够的代码示例来帮助你

标签: java callback gpio android-things


【解决方案1】:

您可能根本不想使用通知/等待,尤其是在主线程上。

Android 使用事件循环来执行诸如将结果发布到回调的事情。如果您在主线程上等待,您将阻塞事件循环,确保您的回调永远不会被调用(并且您的应用程序通常会无响应)。

【讨论】:

    【解决方案2】:

    通过将调用waitForInterrupt 移动到它自己的线程来解决。以前,它是由不同的回调函数调用的,现在它只是启动线程。估计是在回调里面等待回调是自找麻烦,可能GPIO回调只能串联执行..?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多