Adobe Air:渲染需要时间时的空指针

时间:2013-08-24 08:21:11

标签: flex air

我正在使用受控制的ViewStack,其中所选NavigatorContent的可见性取决于用户从下拉菜单中选择的选项。

enter image description here

ViewStack的每个视图都有自己独立的UI元素,包括2-3个DataGrid,图表等 - 将其视为一个简单的学校应用程序,每个视图都绑定到一个课程,并显示该课程的学生表现(同时列出学生在网格中)

有时,显示数据存在问题 - 在渲染完成之前,数据已准备好填充;这会抛出一个null异常,因为尚未创建需要填充数据的UI元素。

为此,我将'creationPolicy'设置为'all'。设置此属性后,一切正常。 但肯定存在大量的性能问题: -

  1. 即使用户从未访问过第一个可见视图,其他视图也会被渲染(UI元素已初始化并创建)。
  2. 在启动时遇到性能 - 启动时间很长,并随着我拥有的视图数量而增长(现在我有9个视图,其中 creationPolicy 设置为全部)!默认情况下只有第一个视图可见并且 creationPolicy 设置为默认/自动
  3. 时,应用程序可以快速加载
  4. UI类型挂起/在应用程序启动时变得无响应(因为它们都发生在同一个线程中)
  5. 对此可能有什么解决办法。

    这些是我想到的解决方案,并且因某种原因而无效:

    • 第一次通过下拉控制器选择视图(即,当渲染和UI创建尚未发生时),我可以显示预加载器或某个时间。我试过这样做,但UI仍然挂起/变得没有响应。
    • CallLater有帮助吗?不是真的,因为我仍然会创建所有视图,即使它们不是必需的。

    因此,在创建/实例化时,我需要一种优雅的方式来显示视图(并显示某种进度或加载器)。

    更新

    当存在某种竞争条件时,我得到Null错误 - 当UI元素的渲染完成之前处理(将数据填充到UI组件,比如网格)完成时 - 我已经认识到为什么它发生了。最初,我将creationPolicy设置为默认值,因此每当我用来选择视图时,它都是在那时创建的;如果在创建视图元素之前返回了要填充的数据,则会出现空指针(因为我用来引用的UI元素仍然被创建,因此在该实例中为null)。  现在我被迫将creationPolicy设置为all,以便为所有视图创建UI,并从下拉列表中选择该视图时触发数据处理。

    我更喜欢做的是有一种方法来按需创建UI(即使没有使用,也不是所有的UI)。

2 个答案:

答案 0 :(得分:3)

也许您不应该让数据处理推送结果,反之亦然,一旦UI控件准备就绪,让UI从模型中提取数据?

例如,将数据驻留在绑定到DataGrids的ArrayCollections中。那样,谁首先完成并不重要。数据生成器甚至不必知道显示它的人或位置,并且只要ArrayCollection发出数据已更改的信号,UI就会显示数据。

答案 1 :(得分:1)

我建议您使用模块而不是视图堆栈。

使用模块时会创建单独的swf文件,并且在加载应用程序时不会加载。仅当通过moduleloader.load(module)方法调用模块文件时才会加载模块文件。