我目前正在使用 LeJOS Ev3 库并编写了以下监听器:
import lejos.hardware.port.Port;
import robots.ev3.drive.parts.LightSensor;
public abstract class LightListener {
protected int trigger;
protected boolean dark;
public LightListener(int triggerLevel) { trigger = triggerLevel; }
public void notify(LightSensor s) {
// Depending on the value that s measures, either the method
// dark or bright is called
}
public void initialValue(int level) {
dark = level < trigger;
}
abstract public void bright(Port port, int level);
abstract public void dark(Port port, int level);
}
正如您所看到的,有一个名为“notify”的方法,它应该根据传感器测量的内容来调用不同的方法。我希望能够仅在传感器测量的值发生变化时调用通知方法,而不使用不断检查值是否发生变化的 while 循环。但我想不出或找不到实现这一目标的方法。
我唯一想到的就是启动一个运行此代码的线程:
while(true) {
waitForSensorValueToChange();
listener.notify(sensor);
}
但是,我什至不知道是否可以等待事件发生(无需不断检查值)。
编辑 - 由于已经多次向我建议,我会提到我已经在我的 LightSensor 上添加了一个名为 addLightListener(LightListener Listener) 的方法。这并不能解决我避免轮询的问题。
最佳答案
不熟悉该库,但您的两个基本选项是轮询(到目前为止您已经尝试过的)或使用 observer pattern .
在观察者模式中,当事件发生时,您会通知已注册到提供程序的任何类。
class ObserveMe {
List<Observer> observers = new ArrayList<>();
public updateSensorValue(){
//do what you need to
for(Observer observer : observers){
observer.notify();
}
}
public void addObserver(Observer o){
this.observers.add(o);
}
}
interface Observer {
public void notify();
}
关于java - 如何创建自己的事件。当传感器的值发生变化时如何调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35303254/