[英]Can Java Observer and Observable be used in this case?
我有一個Android應用程序,我將使用Java Observer
和Observable
類來實現Observer模式來監聽要更改的變量。 我已將問題簡化為可編譯的Java項目。
擴展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);
}
}
實現Observer
類
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());
}
}
我遇到的問題是當我嘗試在ServerResonse.java
調用setResponse
時,觀察者不會被通知...但是當我在UserProfileActivity.java
調用setResponse
時,觀察者能夠獲得通知。 這種行為不是我的預期。
我想要的預期行為是ServerResponse
類是在從Web服務器收到響應后調用setResponse
(這全部在ServerResponse
處理)。
我是否誤解了Java的Observer
和Observable
類? 我很困惑,為什么Observer
能夠在ServerResponse
調用setResponse
,如果Observer
是應該收到通知的那個。 對我來說似乎有些倒退。
我將挑選代碼:
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);
}
現在調用update方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.