我正在尝试在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属性?
可以安全地假设当这个时间轴运行时,它不会在内存中保存具有不同动画属性的其他对象吗?
答案 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元素的垃圾收集。