1

我目前正在使用 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) 的方法。这并不能解决我避免轮询的问题。

4

1 回答 1

0

不熟悉该库,但您的两个基本选项是轮询(到目前为止您已经尝试过)或使用观察者模式

在观察者模式中,当事件发生时,您会通知任何已注册到提供者的类。

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();
}
于 2016-02-09T22:28:27.387 回答