CodenameOne连接请求等待postResponse

时间:2015-09-23 12:35:13

标签: java rest codenameone

我做了一个休息网络服务,它给了我一些联系信息,比如数字,年龄......我在这个函数中得到了所有这些信息

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在......之后执行我不知道我做错了什么

1 个答案:

答案 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上被阻止。