INDEFINITE时间轴是否为每个关键帧在内存中累积帧?

时间:2018-01-16 13:33:32

标签: javafx timer

我正在尝试在JavaFX中生成类似于javax.swing.Timer的简单周期性事件。似乎javax.animation.Timer是这样做的新方法。我可以使用以下代码每2秒生成一个事件:

Timeline timeline = new Timeline(new KeyFrame(
        Duration.millis(2000),
        e -> iterate()));
timeline.setCycleCount(Animation.INDEFINITE);

看起来我只创建了一个应该每2秒重新评估一次的关键帧。但后来有this mysterious warning from the Timeline API

  

警告:正在从FX运行时引用正在运行的时间轴。   如果没有停止,无限时间轴可能会导致内存泄漏   正常。具有动画属性的所有对象都不会   垃圾收集。

是否可以安全地假设此示例时间轴不会累积内存,因为它不访问JavaFX属性?

可以安全地假设当这个时间轴运行时,它不会在内存中保存具有不同动画属性的其他对象吗?

1 个答案:

答案 0 :(得分:2)

FX工具包将保留对任何正在运行的动画的引用。因此,如果动画无限期地运行,通过调用 private FFieldDataLink:TFieldDataLink; FDataList:Tlist; if FFieldDataLink.DataSet.Active and (FFieldDataLink.FieldName<>'' ) then begin try FFieldDataLink.DataSet.GetFieldList(FFDataList,FieldDataLink.FieldName); except DatabaseErrorFmt(SFieldNotFound, [Self.Name,FFieldDataLink.FieldName]); end; end; ,工具包将保留对它的引用,直到除非调用setCycleCount(Animation.INDEFINITE)

当然,时间轴引用了它的所有stop()KeyFrame引用了它们的事件处理程序,而事件处理程序又可以保留引用(通常是UI元素)。因此,如果动画无限期运行,它将阻止对其动画的任何UI元素进行垃圾收集,即使这些元素不再显示且超出了应用程序的其余部分。

因此,您引用的警告建议如果您使用无限制动画,则必须在这些动画上调用KeyFrame,如果您停止显示正在设置动画的节点(或者更常见的是,允许它们引用的对象超出范围)。没有“stop() s的累积”,但是如果不调用KeyFrame,您可以防止不再使用的UI元素的垃圾收集。