2011-09-24 54 views
1

我有一個Java對象,並在其中存在由「知名文本」字符串定義的空間形狀。在我的GWT UI中對該對象進行鼠標懸停時,我的代碼通過JSNI將此字符串傳遞給Javascript,從而進行一堆解析並創建適當的Bing Maps API形狀。在Java中存儲Javascript對象

這是一個簡單的例子,它是一個地圖應用程序,其中每個狀態作爲包含狀態名稱和定義其周界的字符串的對象存在。在我的用戶界面中對狀態名稱進行鼠標懸停時,將對外圍字符串進行分析,並在地圖上繪製一個代表形狀。

所以現在,我的代碼在每次用戶使用鼠標時都會傳遞,解析和創建對象。我正在尋找一種解析字符串的方法,並且只創建一次對象,希望能夠在原始Java對象本身中存儲已完整創建的Javascript對象(Bing地圖形狀)。我認爲,這應該可以加快速度 - 當用戶每次將鼠標移動到不同的項目時,必須解析並創建幾個非常詳細的地圖對象,UI纔開始顯得遲鈍。

是否有可能將這種性質的Javascript對象存儲在我的Java對象中,然後在我需要時將它們帶回到Javascript?

在我的Java代碼(GWT)中,我可以創建一個JavascriptObject,但是這足以容納諸如Microsoft.Maps.Polygon對象嗎?

謝謝!

回答

1

爲什麼不把它們緩存在JavaScript?一旦你在Javascript中創建了一個對象,將它存儲在一個緩存對象中,其中的字符串作爲鍵。然後,每當你得到一個新對象的請求,你檢查緩存並使用預先創建的緩存(如果有的話)。如果沒有預先創建的,則創建它並將其添加到緩存中。

如果你想預先創建一些對象,你可以讓java只用一堆字符串來調用javascript,它將預先填充緩存。這樣可以保留柵欄Javascript一側的所有Javascript對象以及柵欄網站上的所有Java對象,但仍應該有助於提高性能。

這是僞代碼的總體思路:

var cache = {}; 

function createJSObject(stringArgument) { 
    if (stringArgument in cache) { 
     return(cache[stringArgument]); 
    } 
    var obj; 

    // create the object here 
    // ... 

    // cache the object we created 
    cache[stringArgument] = obj; 
    return(obj); 
} 
+0

這真是個好主意。我唯一關心的是緩存大量這些Javascript對象所需的瀏覽器內存。我會在這裏再次嘗試和評論 - 但非常感謝你 - 這是一個非常好的解決方案。 – jcovert

+0

如果您擔心總內存消耗,您可以實現一個LRU(最近使用最少的)緩存,一旦緩存到達一定數量的對象,就扔掉一段時間內尚未使用的舊對象。 Google搜索「javascript lru cache」會爲您提供相關信息。但是,您應該首先測試內存使用情況,看看是否有必要。 – jfriend00

1

可以很好地在你的類中的字段,或JavaScriptObject類型的變量來存儲來自JS來的任何對象。

GWT已經在幾個地方做到了這一點:例如在com.google.gwt.xml.client.impl.DOMItem