Tworzę małą grę w LibGDX. Zapisuję nazwę użytkownika gracza lokalnie, a także na serwerze. Problem polega na tym, że aplikacja nie czeka na wynik połączenia, więc identyfikator bazy danych online nie jest zapisywany lokalnie. Oto ogólny przepływ kodu:Synchroniczne odpowiedzi na `Gdx.net.sendHttpRequest` w LibGDX
//Create a new user object
User user = new User(name);
//Store the user in the online database
NetworkService networkService = new NetworkService();
String id = networkService.saveUser(user);
//Set the newly generated dbase ID on the local object
user.setId(id);
//Store the user locally
game.getUserService().persist(user);
w tym kodzie zmienna id
nie jest uzyskiwanie ustawione, ponieważ funkcja saveUser
wraca natychmiast. Jak mogę sprawić, aby aplikacja czekała na wynik żądania sieci, aby móc pracować z wynikami z komunikacji z serwerem?
Jest to kod dla saveUser
:
public String saveUser(User user) {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("action", "save_user");
parameters.put("json", user.toJSON());
HttpRequest httpGet = new HttpRequest(HttpMethods.POST);
httpGet.setUrl("http://localhost:8080/provisioner");
httpGet.setContent(HttpParametersUtils.convertHttpParameters(parameters));
WerewolfsResponseListener responseListener = new WerewolfsResponseListener();
Gdx.net.sendHttpRequest (httpGet, responseListener);
return responseListener.getLastResponse();
}
Jest to klasa WerewolfsResponseListener
:
class WerewolfsResponseListener implements HttpResponseListener {
private String lastResponse = "";
public void handleHttpResponse(HttpResponse httpResponse) {
System.out.println(httpResponse.getResultAsString());
this.lastResponse = httpResponse.getResultAsString();
}
public void failed(Throwable t) {
System.out.println("Saving user failed: "+t.getMessage());
this.lastResponse = null;
}
public String getLastResponse() {
return lastResponse;
}
}
Co to jest "NetworkService"? To nie jest część Libgdxu, którą widzę. Każda asynchronia, którą widzisz, jest właściwością kodu wewnątrz 'saveUser', ponieważ metody Java są zawsze synchroniczne, więc będziesz musiał rozwinąć to. –
Zobacz edycję kodu. – Robbert