java - 如何创建自己的事件。当传感器的值发生变化时如何调用方法?

标签 java events observer-pattern listeners lejos-nxj

我目前正在使用 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/

相关文章:

javascript - 如何让 JQuery/Javascript 访问 extJS 生成的元素?

Java 观察者模式不通知

observer-pattern - Magento AddAttributeToSelect() 关于自定义添加的属性(观察者)

java - 正则表达式在 String.matches() 中不起作用

java - Openshift MySQL 连接器

c# - 我可以使用 null 条件运算符而不是经典的事件引发模式吗?

javascript - 用 jQuery.on 替换 jQuery.bind

java - 如何从后台服务更新 Android Activity 中的信息

java - 将散列密码与 salt (bcrypt) 进行比较总是返回 false

java - 如何暂停线程执行