2014-10-25 4 views
0

Я работаю над Java-приложением. Я создаю класс Singleton, чтобы ограничить экземпляр этого класса одним объектом. В том же классе у меня есть метод, который возвращает ArrayList объекта, называемого GuestAgent. Вот мой метод: активацияArrayList возвращает нулевое значение

//Singleton class: Tenant 
public ArrayList<GuestAgent> gAgentList() { 
    final ArrayList<GuestAgent> guestAgents = new ArrayList<>(); 
    String url = "http://localhost:8080/StackUI/v2.0/"; 
    url = url + this.tenantId; 
    url = url + "/os-agents"; 

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url)); 
    builder.setHeader("X-Auth-Token", this.tokenId); 

    try { 
     builder.sendRequest(null, new RequestCallback() { 
      @Override 
      public void onError(Request request, Throwable exception) { 
       Window.alert("Attenzione si è verificato un errore"); 
      } 

      @Override 
      public void onResponseReceived(Request request, Response response) { 
       if (200 == response.getStatusCode()) { 
        final HTML respBox = new HTML(); 
        respBox.setHTML(response.getText()); 

        String risposta = response.getText(); 

        JSONValue jsonValue; 
        JSONArray jsonArray; 
        JSONObject jsonObject; 
        JSONString jsonString; 
        JSONNumber jsonNumber; 

        jsonValue = JSONParser.parseStrict(risposta); 

        if ((jsonObject = jsonValue.isObject()) == null) { 
         Window.alert("Error parsing the JSON"); 
        } 

        jsonValue = jsonObject.get("agents"); 
        if ((jsonArray = jsonValue.isArray()) == null) { 
         Window.alert("Error parsing the JSON"); 
        } 

        for (int i = 0; i < jsonArray.size(); i++) { 
         GuestAgent guestAgent = new GuestAgent(); 
         jsonValue = jsonArray.get(i); 

         if ((jsonObject = jsonValue.isObject()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 

         jsonValue = jsonObject.get("agent_id"); 
         if ((jsonNumber = jsonValue.isNumber()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setAgentId(jsonNumber.toString()); 

         jsonValue = jsonObject.get("architecture"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setArchitecture(jsonString.stringValue()); 

         jsonValue = jsonObject.get("hypervisor"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setHypervisor(jsonString.stringValue()); 

         jsonValue = jsonObject.get("md5hash"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setMd5hash(jsonString.stringValue()); 

         jsonValue = jsonObject.get("os"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setOs(jsonString.stringValue()); 

         jsonValue = jsonObject.get("url"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setUrl(jsonString.stringValue()); 

         jsonValue = jsonObject.get("version"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setVersion(jsonString.stringValue()); 

         guestAgents.add(guestAgent); 
        } 

       } else { 
        // Handle the error. Can get the status text from response.getStatusText() 
        Window.alert("Errore " + response.getStatusCode() + " " + response.getStatusText()); 
       } 
      } 
     }); 
    } catch (RequestException e) { 
     // Couldn't connect to server 
     Window.alert("Impossibile connettersi al server"); 
    } 

    return guestAgents; 
} 

метод из другого класса:

//Other class 
ArrayList<GuestAgent> agents; 
agents = Tenant.getTenantObject().gAgentList(); 
Window.alert(Integer.toString(agents.size())); 

На данный момент, я обнаружил, что agents список пуст. Надеюсь, кто-то поможет. Giacomo.

+0

Если ошибок нет, единственным способом получить пустой список является пустой jsonArray. Добавьте проверку if (jsonArray.length == 0) {alert ("empty json");} – nomoa

+0

Я проверил jsonArray и не пуст. Я не знаю, что не так с моим кодом. –

+0

Похож на асинхронный код, возможно, sendrequest является асинхронным, если это так, вам нужно дождаться, когда запрос будет выполнен, прежде чем возвращать ваш список. Проверьте, какой объект возвращается sendRequest, там должна быть некоторая логика ожидания. – nomoa

ответ

1

Вызов производится RequestBuilder является асинхронным, а это означает, что после вызова builder.sendRequest, это занимает некоторое время, чтобы запустить один из двух обратных вызовов методов onError и onResponseReceived.

Ваша проблема заключается в том, что вы правильно запустили процесс async, но вы возвращаете массив guestAgents сразу! (посмотрите на последнюю строку кода). На этом этапе результат асинхронного вызова еще не готов, и массив все еще пуст.

Такие методы обычно не дают возвращаемого значения, но они принимают функцию обратного вызова в качестве аргумента, который будет вызываться, когда процесс завершится и будет содержать результирующие значения. Другими словами, вам всегда нужно дождаться завершения запроса до получения доступа к массиву guestAgents.

Я хотел бы сделать это так (я сделал это с помощью простого блокнота без компиляции, не может быть ошибки ...):

//Other class 
ArrayList<GuestAgent> agents; 
agents = Tenant.getTenantObject().gAgentList(new AgentsResultCallback { 
    void onCompleted(ArrayList<GuestAgent> agents) { 
     // here we have the result! 
     if (agents != null) { // check for errors 
      Window.alert(Integer.toString(agents.size())); 
     } 
    } 
}); 

Одноэлементный:

//Singleton class: Tenant (LOOK AT THE VOID RETURN VALUE!) 
public void gAgentList(final AgentsResultCallback callback) { 
    final ArrayList<GuestAgent> guestAgents = new ArrayList<>(); 
    String url = "http://localhost:8080/StackUI/v2.0/"; 
    url = url + this.tenantId; 
    url = url + "/os-agents"; 

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url)); 
    builder.setHeader("X-Auth-Token", this.tokenId); 

    try { 
     builder.sendRequest(null, new RequestCallback() { 
      @Override 
      public void onError(Request request, Throwable exception) { 
       Window.alert("Attensione si è verificato un errore"); 
       callback.onCompleted(null); // call the callback with null results 
      } 

      @Override 
      public void onResponseReceived(Request request, Response response) { 
       if (200 == response.getStatusCode()) { 
        final HTML respBox = new HTML(); 
        respBox.setHTML(response.getText()); 

        String risposta = response.getText(); 

        JSONValue jsonValue; 
        JSONArray jsonArray; 
        JSONObject jsonObject; 
        JSONString jsonString; 
        JSONNumber jsonNumber; 

        jsonValue = JSONParser.parseStrict(risposta); 

        if ((jsonObject = jsonValue.isObject()) == null) { 
         Window.alert("Error parsing the JSON"); 
        } 

        jsonValue = jsonObject.get("agents"); 
        if ((jsonArray = jsonValue.isArray()) == null) { 
         Window.alert("Error parsing the JSON"); 
        } 

        for (int i = 0; i < jsonArray.size(); i++) { 
         GuestAgent guestAgent = new GuestAgent(); 
         jsonValue = jsonArray.get(i); 

         if ((jsonObject = jsonValue.isObject()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 

         jsonValue = jsonObject.get("agent_id"); 
         if ((jsonNumber = jsonValue.isNumber()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setAgentId(jsonNumber.toString()); 

         jsonValue = jsonObject.get("architecture"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setArchitecture(jsonString.stringValue()); 

         jsonValue = jsonObject.get("hypervisor"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setHypervisor(jsonString.stringValue()); 

         jsonValue = jsonObject.get("md5hash"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setMd5hash(jsonString.stringValue()); 

         jsonValue = jsonObject.get("os"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setOs(jsonString.stringValue()); 

         jsonValue = jsonObject.get("url"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setUrl(jsonString.stringValue()); 

         jsonValue = jsonObject.get("version"); 
         if ((jsonString = jsonValue.isString()) == null) { 
          Window.alert("Error parsing the JSON"); 
         } 
         guestAgent.setVersion(jsonString.stringValue()); 

         guestAgents.add(guestAgent); 


        } 

         // FINISHED! results are complete so I send them to the callback 
         callback.onCompleted(guestAgents); 

       } else { 
        // Handle the error. Can get the status text from response.getStatusText() 
        Window.alert("Errore " + response.getStatusCode() + " " + response.getStatusText()); 
        callback.onCompleted(null); // call the callback with null results here, too 
       } 
      } 
     }); 
    } catch (RequestException e) { 
     // Couldn't connect to server 
     Window.alert("Impossibile connettersi al server"); 
    } 

    return; // return nothing! 
} 

И маленький объявление класса обратного вызова:

abstract public class AgentsResultCallback { 
    abstract void onCompleted(ArrayList<GuestAgent> agents); 
} 
+0

Спасибо за ваш ответ. Я поймаю проблему. Как мне реализовать функцию обратного вызова, о которой вы говорите? У вас есть пример кода? –

+0

Я обновил ответ;) – TheUnexpected

+0

Ah, un'altra cosa ... Attensione => Attenzione;) – TheUnexpected

0

Вы смущены асинхронизмом. Вот как это работает, chonologically

  1. Вы создаете пустой список
  2. отправке запроса HTTP
  3. Вы вернуть список
  4. Вызывающий отображает размер списка: 0
  5. некоторое время позже, когда возвращается ответ на запрос, вызывается метод обратного вызова onResponseReceived() и добавляет элементы в список.

Метод не должен возвращать список, так как он всегда будет пустым. Вместо этого код, отображающий список, должен вызываться из метода onResponseReceived(), как только вы действительно получили ответ HTTP и заполнили список.

Смежные вопросы