2017-02-05 12 views
1

私はJavaのObserverObservableのクラスを使ってObserverパターンを実装して、変数を変更するのを待ちます。私は問題をコンパイル可能なJavaプロジェクトに単純化しました。私が経験しています問題は、私はServerResonse.javasetResponseを呼び出すしようとすると、観測者が...通知されないですObserverこの場合、Java ObserverとObservableを使用できますか?

import java.util.Observable; 
import java.util.Observer; 

public class UserProfileActivity implements Observer { 

    public static void main (String[] args) { 
     System.out.println("Adding UserProfileActivity as an observer."); 
     ServerResponse server = new ServerResponse(); 
     UserProfileActivity observer = new UserProfileActivity(); 
     server.addObserver(observer); 
    } 

    @Override 
    public void update(Observable o, Object arg) { 
     System.out.println("Response obtained from server: " + o.toString()); 
    } 

} 

を実装Observable

import java.util.Observable; 

public class ServerResponse extends Observable { 

    String request; 
    String response; 

    public ServerResponse() {} 

    public ServerResponse(String reqquest) { 
     //Process HTTP request here. 
     //Notify observers that response has changed. 
     response = "Sample HTTP response from server goes here."; 
     setResponse(response); 
    } 

    public String getResponse() { 
     return response; 
    } 

    public void setResponse(String response) { 
     this.response = response; 
     setChanged(); 
     notifyObservers(response); 
    } 
} 

クラスを拡張し

クラスが、私がをUserProfileActivity.javaに電話すると、オブザーバーは通知を受け取ることができます。この動作は私が期待したものではありません。

Webサーバーからの応答が受信された後に、クラスがsetResponseを呼び出すことが予想される動作です(これはすべてServerResponseで処理されます)。

私はJavaのObserverObservableクラスを誤解していますか? ObserverObserverが通知を受け取るべきものである場合、ObserversetResponseServerResponseに呼び出すことができる理由について混乱しています。私は少し後ろにいるようです。

+0

このコードはすべて、notifyObservers(ServerResponseのStringパラメータを持つ未使用のコンストラクタを除く)への呼び出しをトリガするsetResponseの呼び出しをどこにも見ないためです。 – john16384

+0

はい、私は 'UserProfileActivity'と' ServerResponse'で 'setResponse'という行を削除しました。なぜなら、私が望む結果を提供しなかったからです。 – AvP

+0

Observableのことを誤解していると思います。 notifyObserversを呼び出すと、メッセージや何も送信されません。登録されたObserverごとに、同じスレッド上でupdateメソッドを呼び出すだけです。 – john16384

答えて

0

私は離れてコードを選ぶでしょう:

public ServerResponse(String reqquest) { 
    //Process HTTP request here. 
    //Notify observers that response has changed. 
    response = "Sample HTTP response from server goes here."; 
    setResponse(response); 
} 

これは意図した効果を持っていることはありません。あなたは新鮮なResponseクラスを作成したばかりで、どこにも参照を持たない人はいません。誰にも知らせることができないので、誰にも知らせることは無意味です。

public static void main (String[] args) { 
    System.out.println("Adding UserProfileActivity as an observer."); 
    ServerResponse server = new ServerResponse(); 
    UserProfileActivity observer = new UserProfileActivity(); 
    server.addObserver(observer); 
} 

ここでは、オブザーバをserverに追加します。その後、スレッドは終了し、プログラムは終了します。

 for(int i = 0; i < 10; i++) { 
     server.setResponse("New response " + i); 
     Thread.sleep(1000); 
    } 

更新方法は、現在呼び出されます:

は、実際に更新が取得するには、このような何かを追加します。

関連する問題