gpt4 book ai didi

asynchronous - 同步响应 LibGDX 中的 `Gdx.net.sendHttpRequest`

转载 作者:行者123 更新时间:2023-12-04 19:09:46 27 4
gpt4 key购买 nike

我正在用 LibGDX 制作一个小游戏。我将玩家的用户名保存在本地以及服务器上。问题是应用程序没有等待调用结果,因此在线数据库的 ID 没有保存在本地。这是代码的整体流程:

//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);

在这段代码中, id变量未设置,因为 saveUser函数立即返回。如何让应用程序等待网络请求的结果,以便我可以处理服务器通信的结果?

这是 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();
}

这是 WerewolfsResponseListener类(class):
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;
}
}

最佳答案

您看到的异步来自 Gdx.net.sendHttpRequest .每当请求返回时,都会调用第二个参数(您的 WerewolfsResponseListener)上的方法。成功/失败方法不会被“内联”调用。

有两种基本方法可以处理这样的回调结构:“轮询”或“事件”。

通过轮询,您的主游戏循环可以“检查”responseListener看看它是成功还是失败。 (您需要稍微修改您当前的监听器以消除成功案例和空字符串的歧义。)一旦看到有效响应,您就可以执行 user.setId()等等。

使用“事件”,您可以将 user.setId()调用responseListener回调,所以它会在网络响应时执行。这更适合 Libgdx 网络 API。 (这确实意味着您的响应监听器将需要对 user 对象的引用。)

无法在线“等待”网络调用返回。 Libgdx 网络 API(正确)假设您不想在渲染线程中无限期地阻塞,因此它不是为此而结构化的(监听器将作为 Runnable 排队,因此它最早可以运行在下一次渲染调用时) .

关于asynchronous - 同步响应 LibGDX 中的 `Gdx.net.sendHttpRequest`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com