GWT HashMap.put() 不向 HashMap 添加数据

GWT HashMap.put() not adding data to the HashMap

本文关键字:HashMap 添加 数据 不向 put GWT      更新时间:2023-09-26

我在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

编辑

下一个有趣的点。用于orderNoString作为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应有的方式执行的事实。