Layers: catch ArrayIndexOutOfBoundsException in updateLayers, #596

This commit is contained in:
Emux 2018-10-21 17:21:21 +03:00
parent 85c604c1ee
commit 292c092be3
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3

View File

@ -29,6 +29,8 @@ import org.oscim.layers.tile.ZoomLimiter;
import org.oscim.map.Map.InputListener;
import org.oscim.map.Map.UpdateListener;
import org.oscim.renderer.LayerRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.AbstractList;
import java.util.ArrayList;
@ -38,6 +40,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
public final class Layers extends AbstractList<Layer> {
private static final Logger log = LoggerFactory.getLogger(Layers.class);
private final Map mMap;
private final Layer.EnableHandler mEnableHandler;
@ -248,44 +252,48 @@ public final class Layers extends AbstractList<Layer> {
}
private synchronized void updateLayers() {
mLayers = new Layer[mLayerList.size()];
int numRenderLayers = 0;
try {
mLayers = new Layer[mLayerList.size()];
int numRenderLayers = 0;
for (int i = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
for (int i = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
if (o.isEnabled() && o.getRenderer() != null)
numRenderLayers++;
if (o.isEnabled() && o.getRenderer() != null)
numRenderLayers++;
if (o instanceof GroupLayer) {
GroupLayer groupLayer = (GroupLayer) o;
for (Layer gl : groupLayer.layers) {
if (gl.isEnabled() && gl.getRenderer() != null)
numRenderLayers++;
if (o instanceof GroupLayer) {
GroupLayer groupLayer = (GroupLayer) o;
for (Layer gl : groupLayer.layers) {
if (gl.isEnabled() && gl.getRenderer() != null)
numRenderLayers++;
}
}
mLayers[n - i - 1] = o;
}
mLayerRenderer = new LayerRenderer[numRenderLayers];
for (int i = 0, cnt = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
LayerRenderer l = o.getRenderer();
if (o.isEnabled() && l != null)
mLayerRenderer[cnt++] = l;
if (o instanceof GroupLayer) {
GroupLayer groupLayer = (GroupLayer) o;
for (Layer gl : groupLayer.layers) {
l = gl.getRenderer();
if (gl.isEnabled() && l != null)
mLayerRenderer[cnt++] = l;
}
}
}
mLayers[n - i - 1] = o;
mDirtyLayers = false;
} catch (Exception e) {
log.error(e.getMessage(), e);
}
mLayerRenderer = new LayerRenderer[numRenderLayers];
for (int i = 0, cnt = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
LayerRenderer l = o.getRenderer();
if (o.isEnabled() && l != null)
mLayerRenderer[cnt++] = l;
if (o instanceof GroupLayer) {
GroupLayer groupLayer = (GroupLayer) o;
for (Layer gl : groupLayer.layers) {
l = gl.getRenderer();
if (gl.isEnabled() && l != null)
mLayerRenderer[cnt++] = l;
}
}
}
mDirtyLayers = false;
}
}