我做了一个休息网络服务,它给了我一些联系信息,比如数字,年龄......我在这个函数中得到了所有这些信息
public static void getRest(String search) {
if(search.equals("")){
json="http://localhost:8080/com.vogella.jersey.first/rest/jsonServices/print/";
} else {
json="http://localhost:8080/com.vogella.jersey.first/rest/jsonServices/print/"+search;
}
ConnectionRequest req = new ConnectionRequest() {
@Override
protected void postResponse() {
}
@Override
protected void readResponse(InputStream input) throws IOException {
JSONParser p = new JSONParser();
Map<String, Object> h = p.parseJSON(new InputStreamReader(input));
ArrayList object=new ArrayList();
for (Entry<String, Object> entry : h.entrySet()) {
object = (ArrayList) entry.getValue();
int i=object.size();
}
for(int i=0; i<object.size();i++){
LinkedHashMap s= (LinkedHashMap) object.get(i);
Risultati.add(s);
}
}
};
req.setUrl(json);
req.setPost(false);
req.addRequestHeader("Accept", "application/json");
InfiniteProgress prog = new InfiniteProgress();
Dialog dlg = prog.showInifiniteBlocking();
req.setDisposeOnCompletion(dlg);
NetworkManager.getInstance().addToQueue(req);
Risultati是班级的一个属性:ArrayList<LinkedHashMap> Risultati;
问题在于,当我以这种方式调用函数getRest("")
时:
getRest("");
Label contatto=null;
for(int j=0;j<Risultati.size();j++){
LinkedHashMap s=Risultati.get(j);
String nome=(String) s.get("firstName");
String cognome=(String) s.get("lastName");
String numero =(String) s.get("numero");
contatto=new Label(nome+" "+cognome+" "+numero);
}
hi.addComponent(contatto);
它变成Risultati为空,如果我评论for循环我注意到内部函数readResponse在......之后执行我不知道我做错了什么
答案 0 :(得分:1)
我认为重点在于您正在调用NetworkManager.getInstance().addToQueue(req)
。根据{{3}},它会向队列添加连接请求(您刚刚创建的连接请求)。将连接请求添加到队列后,它将返回,这意味着该请求可能已经执行过,也可能没有执行过。
你必须有选择来解决这个问题。在我看来,最好的方法是在请求完成后更新用户界面,如CodeOne手册的it's documentation中所述:
req.addResponseListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
NetworkEvent e = (NetworkEvent)ev;
// ... process the response
}
});
或者,您可以将addToQueue(req)
的号码替换为addToQueueAndWait(req)
。后一种方法等待,直到在队列中处理请求。后一种方法的缺点是您的用户界面可能在处理请求时冻结,因为UI线程在网络I / O上被阻止。