2011-08-25 104 views
8

我正在使用GWT构建应用程序,而且我正面临着我认为速度非常快的严重速度问题。我有下面的结构数据的JSONObject(但大得多):通过GWT中的JSONArray缓慢迭代

{"nodeData" : [ 
       { "name":"one", "attributes":["uno","dos"]}, 
       {"name":"two", "attributes":["tres"]} 
       ] 
} 

我试图通过JSON对象进行迭代来存储所有属性在其中每个节点对象都有一个ArrayList,具有属性大小从4到800

JSONObject JSONnode = nodeData.get(i).isObject(); 
Node node = new Node(JSONnode.get("name").toString(); 
JSONArray attributeArray = JSONnode.get("Attributes").isArray(); 
int attributeSize = attributeArray.size(); 


for(int j = 0; k < attributeSize; j++){ 
    node.attributeArrayList.add(attributeArray.get(j).toString(); 
} 

for循环,我执行走约一分钟,这似乎太长了,我不知道如何改进它。一分钟处于开发模式,但我不知道编译它时会不会更快。

+0

解析JSON结构的方式很好。对于大约800条记录,一分钟听起来有点多。不过,我可以保证在生产模式下性能良好(您应该尝试使用它)。出于测试目的,您可以删除node.attributeArrayList.add()调用并查看它是否会影响性能。顺便说一句你在开发模式中使用哪种浏览器? –

+0

我不使用生产模式的原因是因为我在异步调用中遇到404错误。由于我没有在开发模式中获得404,我只是一直使用它。我寻找答案表明它可能是一个SOP问题,所以我有点推动把它固定在一边。 – aelnaiem

+0

404与SOP无关(因为404意味着服务器已到达)。然而,很可能你使用的是绝对路径,因为web应用程序部署在服务器的ROOT处,所以绝对路径工作在开发模式下,但不能在prod模式下使用非空的“上下文路径”。最有可能的解决办法是将您的路径连接到'GWT.getHostPageBaseURL()',因此它与您的主机页面“相对”,无论它在哪里部署。 –

回答

0

你如何使用GWT?在IDE中? 以我的经验,有太多的断点放慢执行流程,可能你可以检查? 特别是当我看到在生产中它似乎很好......

0

如果一切都失败了,你可以随时在原生Javascript中编写并通过JSNI调用它。

3

您是否尝试过使用覆盖?

GWT Coding Basics - JavaScript Overlay Types

你可以很容易地创建覆盖类型: -

// An overlay type 
class Customer extends JavaScriptObject { 

    // Overlay types always have protected, zero-arg ctors 
    protected Customer() { } 

    // Typically, methods on overlay types are JSNI 
    public final native String getFirstName() /*-{ return this.FirstName; }-*/; 
    public final native String getLastName() /*-{ return this.LastName; }-*/; 

    // Note, though, that methods aren't required to be JSNI 
    public final String getFullName() { 
    return getFirstName() + " " + getLastName(); 
    } 
} 

使用非常简单,我认为会比使用的JSONObject对象快得多。