2017-02-05 4 views
1

Java ObserverObservable 클래스를 사용하여 Observer 패턴을 구현하여 변경할 변수를 수신 대기하는 Android 애플리케이션이 있습니다. 필자는이 문제를 컴파일 가능한 Java 프로젝트로 단순화했습니다. 내가 ServerResonse.java에서 setResponse를 호출 할 때 Observer이 경우 Java Observer and 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.javasetResponse을 호출하면 관찰자가 알림을받을 수 있습니다. 이 동작은 내가 예상 한 동작이 아닙니다.

웹 서버에서 응답을받은 후에 클래스를 호출하려는 사람은 ServerResponse인데, 이는 모두 ServerResponse으로 처리됩니다.

Java의 ObserverObservable 클래스를 오해하고 있습니까? 나는 ObserverObserver이 통지를 받아야하는 것이라면 ObserversetResponseServerResponse으로 호출 할 수있는 이유에 대해 혼란스러워합니다. 나에게 조금 뒤로 보인다.

+0

ServerResponse의 String 매개 변수가있는 사용하지 않는 생성자를 제외하고 notifyObservers() 호출을 트리거하는 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); 
    } 

업데이트 방법은 이제 호출됩니다.