在处理大量数据时,Flex会导致浏览器无响应

时间:2011-06-29 10:13:21

标签: flex browser flex3 flex4 flash

我有一个actionscript函数,它应该启动一个面板,然后在其中填入Networktopology数据。 因为,网络数据太大,以至于耗费了大量时间并使浏览器挂起! 甚至我也试图显示繁忙的光标,它在处理数据时也停止旋转。

我如何避免这种情况。如何确保处理大量数据不会挂起浏览器。

3 个答案:

答案 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播放器插件中运行,因此它在很大程度上取决于客户端的性能。

  1. 尽可能多地计算服务器。

  2. 阻止大型数据网格的自定义ItemRenderer。

  3. 加载屏幕上实际可见的数据,如果有人像在页面浏览器中那样更改视图,则重新加载