Как мне создать карту, которая показывает всех доступных пользователей онлайн с WorldMapView? - PullRequest
0 голосов
/ 14 января 2019

Как говорит заголовок, я использую WorldMapView, предоставляемый в зависимости от ControlsFX, однако сталкиваюсь с проблемами с памятью ...

Мой сервер отправляет список {широта, долгота} каждого пользователя в сети. Я создаю список объектов Location и добавляю его в ListProperty WorldMapView.

// Attributes
public static ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(1);

public static void main(String[] args){
    launch(args);
}

@Override
public void start(Stage stage) throws Exception{
    BorderPane contentPane = new BorderPane();
    contentPane.setBackground(new Background(new BackgroundFill(Color.BLACK, null, null)));

    WorldMapView worldMapView = new WorldMapView();
    worldMapView.setCountryViewFactory((country) -> {
        CountryView view = new CountryView(country);
        Color fillColor = Color.BLACK;
        view.fillProperty().set(Color.BLACK);
        view.strokeProperty().set(fillColor);
        view.strokeWidthProperty().set(1);
        return view;
    });

    worldMapView.getLocations().add(new Location(0, 0));
    worldMapView.setLocationViewFactory(location -> {
        Circle circle = new Circle();
        Color fillColor = Color.BLACK;
        circle.setFill(fillColor);
        circle.setRadius(8);
        circle.setTranslateX(-4);
        // translate to center node on location
        circle.setTranslateY(-4);
        // translate to center node on location
        return circle;
    });

    contentPane.setCenter(worldMapView);
    stage.setScene(new Scene(contentPane, 500, 500));
    stage.show();

    EXECUTOR.scheduleAtFixedRate(() -> {
        List<Location> locations = IntStream.range(0, 50).boxed().map((value) -> {
            return new Location(generateRandomDoubleInRange(60, -60), generateRandomDoubleInRange(120, -120));
        }).collect(Collectors.toList());
        Platform.runLater(() -> {
            worldMapView.locationsProperty().clear();
            worldMapView.locationsProperty().addAll(locations);
        });
    }, 0, 500, TimeUnit.MILLISECONDS);
}

Я ожидаю, что он очистит объекты Circle после очистки списка, однако это не так. Кажется, это происходит, но со временем объекты Circle не очищаются, и в итоге программа использует столько памяти, сколько позволяет максимально допустимый (хотя это не приводит к ошибкам). Это займет некоторое время (примерно 6 минут, чтобы получить полную картину; с предоставленным мною кодом). https://github.com/controlsfx/controlsfx/issues/1091 Я создал отчет о проблемах, но, честно говоря, это может даже не быть ошибкой, поэтому я решил приехать сюда.

Я должен также отметить, что я ускорил время, чтобы вы могли видеть его быстрее. В моей обычной программе обновления установлены примерно на 15 секунд. Требуется некоторое время, чтобы увидеть зависание графического интерфейса с 15 секундами, но в конечном итоге это происходит.

...