gpt4 book ai didi

Java + JavaFX : does it make sense to periodically clear a ListView content on the long run?

转载 作者:行者123 更新时间:2023-11-30 06:17:27 25 4
gpt4 key购买 nike

我会尝试对我的问题提供更准确的见解。

假设我有一个 JavaFX ListView,我通过后台线程不断填充控制台输出,这不会给我的 GUI 带来负担:输出非常繁重,每分钟都会收到很多消息。
如果我不偶尔清除 ListView 的头部(即:最旧的输出),我的应用程序是否会陷入内存加载问题?在我的测试过程中,我没有注意到应用程序的 RAM 占用有任何明显的变化,但我想在长期执行中我可能会注意到这一点。

说实话,我在 StackOverflow 上没有找到任何帖子可以满足我的问题。此外,我只发现了有关如何清除所有 ListView 内容(如 this one )的问题,但不部分涉及循环任务(可能由计时器触发?)。

感谢您向我提供的任何见解、反馈和/或文档。

最佳答案

ListView 由一个列表支持,称为其items 列表。您可以向该列表添加任意数量的项目;但请注意,您不会使 UI 的内存占用负担过重,因为 ListView 的实现是通过使用(或多或少)固定的“单元格”集并重用它们来显示新数据,例如,用户 ScrollView 。

也就是说,当然,如果您继续无限制地向列表添加更多项目,那么它将使用更多内存,并最终导致 OutOfMemoryError。您可以使用类似的东西轻松测试这一点

ListView<String> listView = new ListView<>();
int count = 0 ;
while (true) {
listView.getItems().add("Item "+(++count));
}

这当然会很快耗尽内存。

如果您要向列表中添加大量项目,并且希望应用程序运行一段时间(这对于任何桌面应用程序来说基本上都是可能的 - 我在笔记本电脑上一次运行 Chrome 和 Eclipse 几个月),那么您应该限制列表中的项目数量。这很容易做到,如果添加项目会超过某个最大值,只需从列表前面删除项目即可。例如

public class Controller {

private static final int MAX_LIST_VIEW_ITEMS = 5_000 ;

private ObservableList<String> listData = FXCollections.observableArrayList();

@FXML
private ListView<String> listView ;

public void initialize() {
listView.setItems(listData);
// ...
}

public void addToListView(List<String> itemsToAdd) {
listData.addAll(itemsToAdd);
int excess = itemsToAdd.size() - MAX_LIST_VIEW_ITEMS ;
if (excess > 0) {
listData.subList(0, excess).clear();
}
}

// ...
}

关于Java + JavaFX : does it make sense to periodically clear a ListView content on the long run?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com