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

そのライブラリには慣れていませんが、2 つの基本的なオプションはポーリング (これまでに試したこと) か、オブザーバー パターンを使用することです。

オブザーバー パターンでは、イベントが発生したときに、プロバイダーに登録されているすべてのクラスに通知します。

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 に答える