我想知道在Observer仍在执行重写方法更新(Observable observable,Object obj)时多次通知Observer时会发生什么。
我有一个具体的Observable类:
public class HttpRequestQueue extends Observable{
//an example queue(for explanation) and other class members
public Queue queue..
public void addToQueue(HttpRequest request){
queue.add(request);
setChanged();
notifyObservers();
}
}
另一个是Observer的课程
public class Webclient implements Observer{
@Override
public void update(Observable observable, Object data) {
while (!observable.queue.isEmpty()){
//NETWORK OPERATION!!
processRequest(queue.remove());
}
}
}
这是主要课程:
public static main(){
HttpRequestQueue qu = new HttpRequestQueue();
Webclient wClient = new WebClient();
qu.addObserver(wClient);
//Now start other application operations
qu.add(new HttpRequest(...)); //Observer's update will be called 1st time
qu.add(new HttpRequest(...)); //Observer's update will be called 2nd time
qu.add(new HttpRequest(...)); //Observer's update will be called 3rd time
}
现在,Observer Webclient的update()的行为将是第二次调用它时,第一次执行将不会结束。
抱歉,如果我听起来像个笨蛋。
答案 0 :(得分:2)
长时间运行的操作应该在不同的线程中执行。如果我理解正确,processRequest()
是一个长时间运行的操作,它将阻止应用程序,直到处理完成。
嗯,应该以与此相似的方式实施:
public void processRequest(final HttpRequest req) {
new Thread() {
@Override
public void run() {
//processing logic
}
}.start();
}
因此,没有什么可以阻止你的申请。
我想知道在Observer仍在执行重写方法更新(Observable observable,Object obj)时多次通知Observer时会发生什么。
嗯,在processRequest
完成之前,Observer不会收到通知。如果所有内容都是从一个线程执行的,那么此操作processRequest
将完成,然后才会执行下一个q.add(new HttpRequest(...));
。