Android 直到 wait() 超时后才触发 GPIO 中断
Android Things GPIO interrupt not triggered until after wait() timeout
我已经完成了这个基本设置,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()
的超时总是会耗尽,即使发生中断。然后才执行回调。
有没有办法在回调发生时立即执行,如果有,怎么做?
您可能根本不想使用 notify/wait,尤其是在主线程上。
Android 使用事件循环来执行诸如 post 结果回调之类的事情。如果您在主线程上等待,您将阻塞事件循环,确保您的回调永远不会被调用(并且您的应用程序通常会无响应)。
通过将对 waitForInterrupt
的调用移动到它自己的线程来解决。之前,它是由不同的回调函数调用的,现在只是启动线程。我猜在回调中等待回调是自找麻烦,也许GPIO回调只能串行执行..?
我已经完成了这个基本设置,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()
的超时总是会耗尽,即使发生中断。然后才执行回调。
有没有办法在回调发生时立即执行,如果有,怎么做?
您可能根本不想使用 notify/wait,尤其是在主线程上。
Android 使用事件循环来执行诸如 post 结果回调之类的事情。如果您在主线程上等待,您将阻塞事件循环,确保您的回调永远不会被调用(并且您的应用程序通常会无响应)。
通过将对 waitForInterrupt
的调用移动到它自己的线程来解决。之前,它是由不同的回调函数调用的,现在只是启动线程。我猜在回调中等待回调是自找麻烦,也许GPIO回调只能串行执行..?