【问题标题】:Flex prevent item renderer recycling?Flex 阻止项目渲染器回收?
【发布时间】:2011-05-30 06:33:00
【问题描述】:

有没有办法防止在 Flex 4.5 上回收使用 Spark 组件渲染的项目?

这听起来可能很荒谬,但实际上这会起到作用,直到我对渲染生命周期有了更多了解

【问题讨论】:

  • 我认为这不可能。假设你有十万个项目要渲染,那将是很多实例。如果您只显示 10 个项目,那么创建和重用的 12 个项目是一个很好的以性能为中心的设计 :) P.S.你为什么要阻止这种情况发生?
  • 我希望阻止它,因为我还没有完全理解这个回收过程,我无法完成我的申请。我在这个问题上花了最后 3 天时间,甚至在这里发帖和专家交流问题 - “出了什么问题?”,带有源代码,但没有人回答我,所以我得出结论,防止它可能是解决方案,以防万一没人知道如何解决问题:stackoverflow.com/questions/6164862/…

标签: apache-flex actionscript-3 itemrenderer


【解决方案1】:

首先,我不建议您这样做。出于性能原因,项目回收对于任何 Flex 应用程序都是必不可少的。我建议您花时间去理解,而不是试图创建应用程序。

但如果你需要这样做,你可以随时在布局中关闭虚拟化:

<s:List>
   <s:layout>
      <s:VerticalLayout useVirtualLayout="false" />
   <s:/layout>
</s:list>

默认情况下,虚拟化是真的。

【讨论】:

  • 我尝试将您的源添加到项目渲染器以及树中,但由于某种原因它不起作用。我应该在哪里添加这段代码以使其工作?
  • 请使用您的代码编辑您的原始问题。但是,它不是在您添加的项目渲染器中,而是在容器组件中(在本例中为列表)。
  • 我为这个问题创建一个短期解决方案:stackoverflow.com/questions/6164862/… 这似乎越来越难以解决
【解决方案2】:

您是否正在使用数据设置项目渲染器的完整状态?如果你根据数据计算状态,而忘记清除或重置它,你会因为回收而得到错误的输出。例如:

public function set data(value:Object):void
{
     if (value.@blackBack == "true")
     {
          setStyle("backgroundColor", "black");
     }
}

当你第一次看到它时,它看起来还不错——黑色的物品是黑色的。但是在你滚动列表之后,你会得到到处都是黑色背景的重复使用的项目。解决方案是始终将样式设置为某个值。多解释一下你的问题,也许是一样的?

【讨论】:

  • 我在询问有关防止回收的问题,因为我实际上没有找到解决此评论底部链接中描述的问题的解决方案。所以 - 我认为在我找到妥善处理它的方法之前,阻止这种回收将是一个短期的解决方案。 stackoverflow.com/questions/6164862/…
【解决方案3】:

我不知道这是否有帮助,但在被介绍给ItemRenderers 之前,我们曾经创建n 个自定义组件实例并调用容器的addChild() 方法将它们添加到屏幕。不会发生回收,所有组件实例都会生成并添加到阶段。如果您有大量对象,这不是一个好主意。

for(var i:int = 0; i < numComponents; i++)
{
    var customComponent:CustomComponent = new CustomComponent();
    // set properties to the customComponent, like data, width etc...
    vBox.addChild(customComponent);
}

将 vBox 设为&lt;mx:VBox id="vBox"/&gt;

如果您想重置元素,请致电vBox.removeAllChildren() 并重复循环以添加它们。

使用此方法的缺点是您必须手动删除所有元素并在数据更改时添加它们。如果不移除某些事件监听器,则可能会发生内存泄漏。

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    据我所知,不可能不阻止项目渲染器的回收。

    关于item renderer回收是如何工作的,我来简单解释一下:

    假设您的应用程序中有一个基于列表的组件(如 List、DataGrid 等)。您正在显示,可以说,100 行数据(以您希望的任何格式)。在大多数情况下,由于屏幕空间限制为了更好的可用性,您不会同时显示 100 行。相反,您将显示 10 行(使用 rowCount 属性或为组件指定特定高度),并使用滚动条查看其余部分项目。因此,在任何给定时间,在 100 行中,您有 10 行可见,其余 90 行在屏幕外。将 90 个屏幕外行的项目渲染器的实例保存在内存中,而您一次只能查看 10 行不是一个很好的性能实践。所以 flex 框架所做的是它将为可见行创建渲染器(在这种情况下为 10 个)加上一些 2 或 3 个额外的渲染器(我不确定到底有多少)。所以,这里是 flex框架只创建了 13 个项目渲染器实例。在滚动时,框架重用已经创建的项目渲染器来显示离屏行,通过将该特定行的数据属性传递给项目渲染器。换句话说,第 14 行将重用为第一行创建的项目渲染器,第 15 行将重用第 2 行,第 16 行将重用第 3 行,依此类推,向下滚动时。

    希望有帮助

    【讨论】:

    • 我完全理解项目渲染和性能提升的想法,因为使用它们。无论如何-我似乎距离正确使用它们还有一点距离,我需要修复我的应用程序。仍然感谢您的解释,可以发现它对其他人有用。我仍然需要找到一种方法来解决我的问题,或者阻止回收渲染器。
    • 一旦开始使用 ItemRenderers,就不会再使用其他技术了。这是我喜欢的 Flex 中一个非常酷的功能,而且可以自定义很多......
    • 好吧,我说“据我所知”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2020-11-10
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多