web-dev-qa-db-ja.com

Androidでは、変数が変更されたときにアクションを実行するにはどうすればよいですか?

Androidアプリ(またはJavaより一般的には同じであれば))では、変数の値が変更されるたびにメソッドを呼び出す最善の方法は何ですか?

33
tsvallender

本当にやりたいことは、イベントが発生したときにリスナーをトリガーするようにイベント駆動型モデルを設定することです(この場合、変数値が変更されたとします)。これは、Javaだけでなく、他のプログラミング言語、特にUIプログラミングのコンテキストでも非常に一般的です(ただし、必ずしもそれだけではありません)。

通常、これは次の手順を実行して行われます。

  • イベントがトリガーされた場合にリスナーが実装する必要があるインターフェースを決定します。あなたのケースでは、それをVariableChangeListenerと呼び、インターフェースを次のように定義できます。


    public interface VariableChangeListener {
        public void onVariableChanged(Object... variableThatHasChanged);
    }

リスナーがここで処理することが重要であると考える任意の引数を置くことができます。インターフェースに抽象化することにより、イベントが発生しているクラスと密結合することなく、変数が変更された場合に必要なアクションを実装する柔軟性があります。

  • イベントが発生したクラス(この場合も、変数が変更される可能性があるクラス)に、イベントのリスナーを登録するメソッドを追加します。 VariableChangeListenerインターフェースを呼び出すと、次のようなメソッドが作成されます。

    // while I only provide an example with one listener in this method, in many cases
    // you could have a List of Listeners which get triggered in order as the event 
    // occurres
    public void setVariableChangeListener(VariableChangeListener variableChangeListener) {
       this.variableChangeListener = variableChangeListener;
    }

デフォルトでは、誰もイベントを聞いていません

  • イベントが発生した(変数が変更された)場合は、リスナーをトリガーします。コードは次のようになります。


   if( variableValue != previousValue && this.variableChangeListener != null) {
       // call the listener here, note that we don't want to a strong coupling
       // between the listener and where the event is occurring. With this pattern
       // the code has the flexibility of assigning the listener
       this.variableChangeListener.onVariableChanged(variableValue);
   }

繰り返しますが、これは基本的にイベントまたは変数の変更に反応するプログラミングの非常に一般的な方法です。 JavaScriptでは、これはonclick()の一部であることがわかります。Androidでは、イベント駆動モデルをチェックして、 OnClickListener などのさまざまなリスナーを確認できます ボタン onclickイベント。この場合、変数が変更されるたびに発生する別のイベントに基づいてリスナーをトリガーします

57
momo