我有一个actionscript函数,它应该启动一个面板,然后在其中填入Networktopology数据。 因为,网络数据太大,以至于耗费了大量时间并使浏览器挂起! 甚至我也试图显示繁忙的光标,它在处理数据时也停止旋转。
我如何避免这种情况。如何确保处理大量数据不会挂起浏览器。
答案 0 :(得分:3)
我不太确定“网络拓扑数据”的含义,您可以提供更多相关信息。我感觉你正在获得一个非常大的XML,而你正试图解析。这是一个问题,因为XML很难正确解析,你应该研究像AMF这样的替代方法,它是非常有效的二进制格式。您还应该研究如何解析数据,因为任何要调用的函数或循环都需要尽可能快。此外,从不只存储XML并绑定到该XML;将xml解析为您自己的模型结构。
话虽如此,您可以查看Green Threading这是一种伪造多线程的方法,而不会完全停止UI,因为Flex是单线程的。您可能希望发布阻止UI的有问题的代码。你正在做的事情并非不可能,只需要正确地做到这一点:)
答案 1 :(得分:2)
您可以尝试限制每帧的处理量,例如50毫秒。当时间限制结束时,保存状态并从ENTER_FRAME处理程序返回。在下一帧,如果仍有未处理的数据,则继续处理
分割算法可能是一项艰巨的任务,但在Flash中存在多线程之前,这是唯一的方法
编辑:我的意思的一些说明:
当您需要处理数据时,请调用processData()。
private static const TIME_LIMIT_MS:int = 50;
private function processData(event:Event = null):void {
var time:int = getTimer();
var currentTime:int;
do {
...
currentTime = getTimer();
while (currentTime - time < TIME_LIMIT_MS)
if (stillHaveWork)
addEventListener(Event.ENTER_FRAME, processData);
else
removeEventListener(Event.ENTER_FRAME, processData);
}
还有一些工作需要确保数据在仍有工作且新部分到达时排队。
答案 2 :(得分:1)
由于Flash在各方面都不是多线程的,并且在Flash播放器插件中运行,因此它在很大程度上取决于客户端的性能。
尽可能多地计算服务器。
阻止大型数据网格的自定义ItemRenderer。
加载屏幕上实际可见的数据,如果有人像在页面浏览器中那样更改视图,则重新加载