Ignore:
Timestamp:
2017-12-31T03:09:43+01:00 (6 years ago)
Author:
Don-vip
Message:

see #15709 - fix a lot of memory leaks. Now gui.layer.geoImage.* classes are correctly garbage collected when the mapframe is destroyed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

    r13264 r13265  
    6363import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
    6464import org.openstreetmap.josm.gui.layer.Layer;
    65 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
    66 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
    67 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
    68 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
     65import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    6966import org.openstreetmap.josm.gui.util.GuiHelper;
    7067import org.openstreetmap.josm.tools.ImageProvider;
     
    10299    private MouseMotionAdapter mouseMotionAdapter;
    103100    private MapModeChangeListener mapModeListener;
     101    private ActiveLayerChangeListener activeLayerChangeListener;
    104102
    105103    /** Mouse position where the last image was selected. */
     
    992990        mapModeListener.mapModeChange(null, MainApplication.getMap().mapMode);
    993991
    994         MainApplication.getLayerManager().addActiveLayerChangeListener(e -> {
     992        activeLayerChangeListener = e -> {
    995993            if (MainApplication.getLayerManager().getActiveLayer() == this) {
    996994                // only in select mode it is possible to click the images
    997995                MainApplication.getMap().selectSelectTool(false);
    998996            }
    999         });
    1000 
    1001         MainApplication.getLayerManager().addLayerChangeListener(new LayerChangeListener() {
    1002             @Override
    1003             public void layerAdded(LayerAddEvent e) {
    1004                 // Do nothing
    1005             }
    1006 
    1007             @Override
    1008             public void layerRemoving(LayerRemoveEvent e) {
    1009                 if (e.getRemovedLayer() == GeoImageLayer.this) {
    1010                     stopLoadThumbs();
    1011                     MapView mapView = MainApplication.getMap().mapView;
    1012                     mapView.removeMouseListener(mouseAdapter);
    1013                     mapView.removeMouseMotionListener(mouseMotionAdapter);
    1014                     MapFrame.removeMapModeChangeListener(mapModeListener);
    1015                     currentPhoto = -1;
    1016                     if (data != null) {
    1017                         data.clear();
    1018                     }
    1019                     data = null;
    1020                     // stop listening to layer change events
    1021                     MainApplication.getLayerManager().removeLayerChangeListener(this);
    1022                 }
    1023             }
    1024 
    1025             @Override
    1026             public void layerOrderChanged(LayerOrderChangeEvent e) {
    1027                 // Do nothing
    1028             }
    1029         });
     997        };
     998        MainApplication.getLayerManager().addActiveLayerChangeListener(activeLayerChangeListener);
    1030999
    10311000        MapFrame map = MainApplication.getMap();
     
    10361005
    10371006    @Override
     1007    public synchronized void destroy() {
     1008        super.destroy();
     1009        stopLoadThumbs();
     1010        MapView mapView = MainApplication.getMap().mapView;
     1011        mapView.removeMouseListener(mouseAdapter);
     1012        mapView.removeMouseMotionListener(mouseMotionAdapter);
     1013        MapFrame.removeMapModeChangeListener(mapModeListener);
     1014        MainApplication.getLayerManager().removeActiveLayerChangeListener(activeLayerChangeListener);
     1015        currentPhoto = -1;
     1016        if (data != null) {
     1017            data.clear();
     1018        }
     1019        data = null;
     1020    }
     1021
     1022    @Override
    10381023    public LayerPainter attachToMapView(MapViewEvent event) {
    10391024        MapView.addZoomChangeListener(this);
    1040         return super.attachToMapView(event);
     1025        return new CompatibilityModeLayerPainter() {
     1026            @Override
     1027            public void detachFromMapView(MapViewEvent event) {
     1028                MapView.removeZoomChangeListener(GeoImageLayer.this);
     1029            }
     1030        };
    10411031    }
    10421032
Note: See TracChangeset for help on using the changeset viewer.