代码之家  ›  专栏  ›  技术社区  ›  Davide3i

Java+JavaFX:从长远来看,定期清除ListView内容有意义吗?

  •  1
  • Davide3i  · 技术社区  · 6 年前

    我会尽量对我的问题给出更准确的见解。

    假设我有一个JavaFX ListView,我通过后台线程不断用控制台输出填充它,这对我的GUI没有负担:输出很重,每分钟都会收到很多消息。
    如果我不偶尔清除ListView的头部(即:最旧的输出),我会使我的应用程序处于有问题的内存加载状态吗? 在测试期间,我没有注意到我的应用程序在RAM占用方面有任何明显的变化,但我想从长远来看,我可能会注意到这一点。

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

    感谢您提供的任何见解、反馈和/或文档,您可以将其反馈给我。

    1 回复  |  直到 6 年前
        1
  •  1
  •   James_D    6 年前

    A. ListView 由一个名为 items 列表您可以向该列表添加任意多个项目;但请注意,在实现 列表视图 其工作原理是使用(或多或少)固定的“单元格”集,并重用它们来显示新数据,例如,用户滚动视图。

    也就是说,当然,如果您继续不受限制地向列表中添加更多项目,那么它将使用更多内存,并最终导致 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();
            }
        }
    
        // ...
    }