如何在不阻止UI的情况下使用闪存计时器异步轮询文件?

时间:2009-06-26 18:26:23

标签: flex multithreading asynchronous timer

我有一个flex应用程序,它反复轮询远程XML文件以检测更改,但我发现一旦文件达到一定大小,轮询就会阻止UI并使页面在短时间内无响应。

有没有办法确保对服务器的调用或flash.utils.Timer类中的事件异步运行到主UI线程?

3 个答案:

答案 0 :(得分:3)

听起来阻塞是由Flash解析XML而不是实际加载引起的。

如果是这种情况,那么你可以继续加载文件,只检查你得到的原始数据的大小 - 如果它更大,解析它并采取解析命中。否则抛出数据并等待下一个请求。

此时没有明确的方法可以使用Flash进行线程化。某些任务自然会发生异步(想到网络和像素),但就是这样。

答案 1 :(得分:1)

Branden是对的 - 我们编写的代码基本上总是发生在主线程上;虽然网络调用本身确实发生在后台线程上,但该调用的处理发生在主要调用上。

要记住的一件事是WebService和HTTPService类可能会尝试自动序列化您的响应,这可能意味着不必要地处理该处理。另一方面,使用URLLoader可以让您更直接地访问响应数据,从而可以更直接地使用它,而不会产生内置处理的不必要开销。

有鉴于此,如果您发现必须处理整个XML文件,您可能会考虑以某种方式将其分解为块,并将这些块的处理分配到单独的函数中,而不是处理范围内的所有内容。单一功能。只是这样做可能允许玩家在处理大量文本(处理一点,退出函数,渲染UI,进入下一个函数,渲染等)时继续更新UI; AIR团队的工程师Oliver Goldman做了presentation on this concept at last year's MAX conference

希望它有所帮助!

答案 2 :(得分:1)

如上所述,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等原生格式或使用Remoting

将数据传递给客户端

您可以使用数据分页吗? ArrayCollections和我很确定XMLCollection支持它

旁注:

虽然AS3是单线程的,但Pixel Bender和我认为Alchemy(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/)。

如果您觉得需要足够的功能,请在Adobe上使用此功能增强票进行投票: https://bugs.adobe.com/jira/browse/ASC-3222