我有一個flex應用程序,它反覆輪詢遠程XML文件以檢測更改,但我發現一旦文件達到一定的大小,輪詢會阻止UI並使頁面在短時間內不響應。如何在不阻止用戶界面的情況下使用閃存定時器異步輪詢文件?
有什麼辦法可以確保從flash.utils.Timer類的服務器或事件的調用異步運行到主UI線程?
我有一個flex應用程序,它反覆輪詢遠程XML文件以檢測更改,但我發現一旦文件達到一定的大小,輪詢會阻止UI並使頁面在短時間內不響應。如何在不阻止用戶界面的情況下使用閃存定時器異步輪詢文件?
有什麼辦法可以確保從flash.utils.Timer類的服務器或事件的調用異步運行到主UI線程?
Branden的權利 - 我們編寫的代碼基本上總是發生在主線程上;雖然網絡調用本身確實發生在後臺線程上,但該調用的處理髮生在主線程上。
要記住的一件事是WebService和HTTPService類可能會嘗試自動序列化您的響應,這可能意味着不必要地處理該處理。另一方面,使用URLLoader可以讓您更直接地訪問響應數據,使您能夠更直接地使用它,而不會產生內置處理的不必要開銷。因此,如果你發現你必須處理整個XML文件,你可能會考慮將它分解成多塊,並將這些塊的處理分配到不同的函數中,而不是處理範圍內的所有內容一個功能。只要這樣做可以讓玩家在處理大量文本(處理一下,退出該函數,渲染UI,進入下一個函數,渲染等等)時繼續更新UI; AIR團隊的工程師Oliver Goldman做了presentation on this concept at last year's MAX conference。
希望它有幫助!
這聽起來像阻塞是由Flash解析XML而不是實際加載引起的。
如果是這樣,那麼你可以繼續加載文件,只是檢查你回來的原始數據的大小 - 如果它更大,解析它,並採取解析命中。否則拋擲數據並等待下一個請求。
目前還沒有明確的方式使用Flash進行線程化。某些任務自然發生異步(想到網絡和pixelbender),但就是這樣。
像上面提到的那樣,AS3是單線程的。但是有幾種方法可以處理你的情況。這裏有你可能的選擇:
首先,確保在加載時確實需要解析整個XML,並且不能將加載的xml節點保存在內存中作爲數據模型(XML現在是本機數據類型)。有時候,我通過傳遞一個XMLNode來創建值對象,並將其保存在內存中,直到需要讀取節點值爲止。這允許您稍後保留一些解析。
如果您使用的ArrayCollection或類似結構來保存數據,請嘗試使用原始陣列(見http://www.arpitonline.com/blog/?p=114一個問題,我跑進)
看看你是否能創造性地使用使用callLater()(http://livedocs.adobe.com/flex/2/langref/mx/core/UIComponent.html#callLater())
你可以通過像SWX這樣的原生格式將數據傳遞給客戶端嗎?或者使用遠程處理
您可以使用數據分頁嗎?ArrayCollections和我敢肯定XMLCollection支持它
側面說明:
雖然AS3是單線程的,Pixel Bender的,我覺得鍊金術(http://labs.adobe.com/technologies/alchemy/)在不同的線程中運行。在使用Pixel Bender進行計算的博客上進行了一些實驗,這些計算不會減慢應用程序的UI(例如:http://elromdesign.com/blog/2009/02/09/using-pixel-bender-to-do-heavy-lifting-calculations-makes-flash-player-multi-thread/)。 https://bugs.adobe.com/jira/browse/ASC-3222
鍊金術在同一個線程上運行(因爲它只是AS)。然而,LVVM支持它自己的綠色線程模型,它允許你編寫後臺線程 - 但它們是軟件線程,而不是OS線程。 – 2009-06-28 15:03:26
在Flex應用程序非常大的SOAP響應打交道時,我已經看到了同樣的事情:如果你覺得這個功能足夠的需求上與Adobe此功能增強票
還請投票。 – 2009-06-27 03:31:44