3

コールバックを使用して複数のリスナーを設定することは可能ですか?

コールバックがどのように機能するかを理解しようとしており、それが必要なものであることを理解しようとしています。

メッセージを送受信するUDPメッセージングクラスが1つあります。特定のメッセージを解析するときに、複数の UI クラスを更新したいと考えています。

現時点では、次のようなものがあります。

class CommInt {

    private OnNotificationEvent notifListener;

    public setNotificationListener(OnNotificationEvent notifListner) {
        /* listener from one UI */
        this.notifListener = notifListener;
    }

    private parseMsg(Message msg) {

        if (msg.getType() == x) {
            notifListener.updateUI();
        }

    }

}

別の UI も更新する必要があります。他の UI は同じインターフェイスを使用しますが、本体は異なります。

そのインターフェースから実装されているすべてのリスナーを呼び出すにはどうすればよいですか?

4

2 に答える 2

3

リスナーの List を作成し、それぞれの呼び出しを反復処理する必要がある可能性が非常に高くなりますupdateUI()。もちろん、addListener()上書きしないようにするためのメソッドも必要です。

class CommInt {

  private List <OnNotificationEvent> listeners= new ArrayList <OnNotificationEvent>();


  public void addNotificationListener(OnNotificationEvent notifListner) {
    listeners.add (notifListener);
  }

  private void parseMsg(Message msg) {

    if (msg.getType() == x) {
      for (notifListener : listeners){
        notifListener.updateUI();
      }
    }

  }

}
于 2013-02-23T16:02:26.767 に答える
0

あなたのコードでは:いいえ、単一の変数を使用して記録しているためです。これを可変長コンテナに置き換えると、好きなだけリスナーが必要になります。

class CommInt {
  private ArrayList<NotificationListener> listeners =
    new ArrayList<NotificationListener>();

  public addNotificationListener(NotificationListener listener) {
    listeners.add(listener);
  }

  private doSomething(Something input) {
    if (input.hasProperty(x)) {
      for (NotificationListener l: listeners) {
        l.inputHasProperty(x);
      }
    }
  }
}

また、ネーミングの違いにも注意してください。Java の慣例では、物事をその内容または動作に基づいて呼びます。リスナーのリストがある場合は、それらに NotificationListener インターフェイスを実装させ、そのように保存します。

また、「セット」は「追加」になり (無限に追加できるため)、コールバックは、コールバックが必要かどうかを判断するために実行したテストにちなんで名付けられました。これにより、メソッド名とその中のコードが意味のあるものになるため、コードがきれいに保たれます。

「メッセージはタイプ...」に基づく「updateUI」はあまり意味がありませんが、「msg.type = Message.CLEAR_DIALOGS」の「l.clearDialogs()」は意味があります。

于 2013-02-23T16:07:35.570 に答える