2011-08-23 9 views
27

Androidアプリ(またはもっと一般的にはJavaであれば違いはありません)では、変数の値が変わるたびにメソッドを呼び出す最良の方法は何ですか?Androidでは、変数が変更されたときにどのように行動しますか?

+0

変数を変更するコードがいくつかある必要があります。 –

+9

変数が変更されたときにアクセスする必要があるオブジェクトは、変数を変更するコードのスコープ内にないためです。 – tsvallender

答えて

54

あなたが本当にやりたいことは、イベントが発生したときに、リスナーをトリガーするイベント駆動型モデルを設定されている(あなたのケースでは、変数の値が変更されたと言います)。

:通常、これは、次の手順を実行することによって行われ

(それだけで、そのために、必ずしもではないが)、これは特にUIプログラミングの文脈でだけでなく、Java用のが、他のプログラミング言語のためだけでなく、非常に一般的です

  • イベントがトリガーされた場合にリスナーが実装するインターフェイスを決定します。あなたはリスナーがここに扱うことが重要だと思う任意の引数を置くことができ


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

:あなたのケースのために、あなたはとしてVariableChangeListenerそれを呼び出すとインタフェースを定義することができます。インターフェイスに抽象化することで、イベントが発生しているクラスとの緊密な結合なしに、変数が変更された場合に必要なアクションを実装する柔軟性が得られます。

  • イベントが発生したクラス(変数の変更可能なクラス)で、イベントのリスナーを登録するメソッドを追加します。あなたのインターフェイス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()の一部として表示され、OnClickListenerなどのさまざまなリスナーのイベント駆動モデルを確認して、Button onclickイベントに設定することができます。あなたのケースでは、変数が変更されたときにいつも異なるイベントに基づいてリスナーをトリガーします。

+7

私は考えています*あなたはこの説明でリスナーに私のために最後にペニーが落ちるのを手伝ったかもしれません。このページはブックマーク中です! –

+1

メソッド 'setVariableChangeListener'を呼び出す必要があるとき、誰かが説明できますか? 'VariableChangeListener'はインターフェースなので、' setVariableChangeListener'には何が渡されますか? – AvP

-4

このようにすることができます。あなたが望むものを正確に定義していないため、動作する可能性があります。あなたの変数名がvであると仮定してください。前のv = vを作る; 。あなたはあなたの条件に応じて、あなたのコードに入れることができます。

if(v!=previous_v){ 
//your stuffs 
} 
+3

これはうまくいきません。なぜなら、それが一度しかチェックされなかったら再びチェックしないからです。著者は、バックグラウンドwhileループのように変数が変更されたときを知りたいと思っています。 –

関連する問題