GWT HashMap.put() 不向 HashMap 添加数据
GWT HashMap.put() not adding data to the HashMap
我在LibGDX中创建了一个游戏,它使用GWT来构建HTML5版本。我有一个用于记录购买的哈希图,并且一些购买被多次处理。调查它,我发现这是因为它们没有被添加到哈希图中。将进程添加到哈希映射的逻辑如下(在桌面,iOS和Android版本上运行良好):
public void updatePurchase(String orderNo, UserPurchase purchase) {
Gdx.app.log("Double Purchase", "In updatePurchase " + orderNo);
if (StringUtils.isNullOrEmpty(orderNo) || purchase == null) return;
Gdx.app.log("Double Purchase", "1");
synchronized (this) {
Gdx.app.log("Double Purchase", "2");
UserPurchase existingPurchase = purchases.get(orderNo);
Gdx.app.log("Double Purchase", "3 " + (existingPurchase != null));
if (existingPurchase == null) {
Gdx.app.log("Double Purchase", "4 " + purchases.containsKey(orderNo));
purchases.put(orderNo, purchase);
Gdx.app.log("Double Purchase", "5 " + purchases.containsKey(orderNo));
setUpdated();
} else {
Gdx.app.log("Double Purchase", "6");
if (existingPurchase.status == UserPurchase.STATUS_NEEDS_PROCESSING && purchase.status == UserPurchase.STATUS_PROCESSED) {
Gdx.app.log("Double Purchase", "7");
existingPurchase.status = UserPurchase.STATUS_PROCESSED;
Gdx.app.log("Double Purchase", "8");
setUpdated();
}
}
}
Gdx.app.log("Double Purchase", "Leave updatePurchase " + orderNo);
}
这将产生以下输出
GWT: WBLOG: Double Purchase: In updatePurchase 787349198062445
GWT: WBLOG: Double Purchase: 1
GWT: WBLOG: Double Purchase: 2
GWT: WBLOG: Double Purchase: 3 false
GWT: WBLOG: Double Purchase: 4 false
GWT: WBLOG: Double Purchase: 5 false
GWT: WBLOG: Double Purchase: Leave updatePurchase 787349198062445
特别注意日志行 4 和 5,哈希映射不包含键orderNo
。然后我打电话给put
,在下一行,哈希图仍然不包含键orderNo
。
这个真的让我难倒了。我在整个游戏中都使用哈希图,这是唯一一个没有按预期工作的哈希图。控制台中未报告任何错误,并且似乎没有发生任何其他意外情况。
编辑
我决定试试这个:
while (!purchases.containsKey(orderNo)) {
Gdx.app.log("Double Purchase", "Trying to add purchase " + count++);
purchases.put(orderNo, purchase);
}
它只是陷入了一个无限循环。这是一个非常顽固的HashMap
!
编辑
下一个有趣的点。用于orderNo
的String
作为JavaScriptObject
的一部分从 Facebook SDK 返回。代码如下:
public class PurchaseResponse extends JavaScriptObject {
protected PurchaseResponse() {
}
public final native String getPaymentId() /*-{
return this.payment_id;
}-*/;
public final native double getAmount() /*-{
return this.amount;
}-*/;
public final native String getCurrency() /*-{
return this.currency;
}-*/;
public final native int getQuantity() /*-{
return this.quantity;
}-*/;
public final native String getRequestId() /*-{
return this.request_id;
}-*/;
public final native String getStatus() /*-{
return this.status;
}-*/;
public final native String getSignedRequest() /*-{
return this.signed_request;
}-*/;
}
尝试对此字符串执行indexOf()
时,我收到异常,并显示indexOf()
方法不存在的消息。 indexOf()
确实存在,并且在普通字符串的 GWT 中运行良好。这个字符串有什么特别之处?我尝试做新的String(orderNo)
,新的字符串也没有按预期工作。
解决了!根据Facebook示例,JSON响应如下:
{
payment_id: "495869257196092",
amount: "5.00",
currency: "USD",
quantity: "1",
request_id: "60046727",
status: "completed",
signed_request: "7QYHzKqKByA7fjiqJUh2bxFvEdqdvn0n_y1zYiyN6tg.eyJhbGCJxdWFudGl0eSI6IjEiLCJzdGF0dXMiOiJjb21wbGV0ZWQifQ"
}
但是在检查实际的 JSON 响应时,它是这样的:
{
"payment_id":795448840585614,
"amount":"0.79",
"currency":"GBP",
"quantity":"1",
"request_id":"xxxx",
"status":"completed",
"signed_request":"xxx"
}
请注意关键的区别。 payment_id
是一个数值,而不是一个String
因此缺少函数以及它没有按照String
应有的方式执行的事实。
相关文章:
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在映射数组中添加换行符
- 正在将数据主题添加到所有项目
- ZeroClipboard-在复制之前添加到值
- 我可以在json对象中添加一个函数吗
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何添加浮动和非浮动,其他
- 添加文字和评论功能更新Div
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 在函数中添加数组元素的数值
- 如何将歌曲添加到jPlayer
- 在html Select中添加搜索
- Java脚本时间添加
- FabricJs-限制主对象内添加对象的移动区域
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 如何在Google柱状图中动态添加行/列
- 正在尝试使用if和else添加类,但无法正常工作
- GWT HashMap.put() 不向 HashMap 添加数据