initialize TileLayer/Manager when added at runtime

fixes NPE where TileManager.onUpdate is run without previous init() when
TileLayer is added at runtime
This commit is contained in:
Hannes Janetzek 2013-06-07 02:53:41 +02:00
parent d449c9668c
commit ee054d1bf9
2 changed files with 9 additions and 11 deletions

View File

@ -30,6 +30,8 @@ public abstract class TileLayer<T extends TileLoader> extends Layer {
protected final int mNumTileLoader = 4; protected final int mNumTileLoader = 4;
protected final ArrayList<T> mTileLoader; protected final ArrayList<T> mTileLoader;
protected boolean mInitial = true;
public TileLayer(MapView mapView) { public TileLayer(MapView mapView) {
this(mapView, MAX_ZOOMLEVEL); this(mapView, MAX_ZOOMLEVEL);
} }
@ -63,9 +65,10 @@ public abstract class TileLayer<T extends TileLoader> extends Layer {
@Override @Override
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) { public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
if (clear) { if (clear || mInitial) {
mRenderLayer.clearTiles(); mRenderLayer.clearTiles();
mTileManager.init(mMapView.getWidth(), mMapView.getHeight()); mTileManager.init(mInitial);
mInitial = false;
changed = true; changed = true;
} }
if (changed) if (changed)

View File

@ -57,7 +57,6 @@ public class TileManager {
private final MapView mMapView; private final MapView mMapView;
private final MapViewPosition mMapViewPosition; private final MapViewPosition mMapViewPosition;
private boolean mInitialized;
// cache for all tiles // cache for all tiles
private MapTile[] mTiles; private MapTile[] mTiles;
@ -132,11 +131,9 @@ public class TileManager {
mTilesForUpload = 0; mTilesForUpload = 0;
mUpdateSerial = 0; mUpdateSerial = 0;
mInitialized = false;
} }
public void destroy() { public void destroy() {
mInitialized = false;
// there might be some leaks in here // there might be some leaks in here
// ... free static pools // ... free static pools
} }
@ -148,13 +145,13 @@ public class TileManager {
} }
public void init(int width, int height) { public void init(boolean first) {
// sync with GLRender thread // sync with GLRender thread
// ... and labeling thread? // ... and labeling thread?
GLRenderer.drawlock.lock(); GLRenderer.drawlock.lock();
if (mInitialized) { if (!first) {
// pass VBOs and VertexItems back to pools // pass VBOs and VertexItems back to pools
for (int i = 0; i < mTilesSize; i++) for (int i = 0; i < mTilesSize; i++)
clearTile(mTiles[i]); clearTile(mTiles[i]);
@ -173,7 +170,7 @@ public class TileManager {
mTilesCount = 0; mTilesCount = 0;
// set up TileSet large enough to hold current tiles // set up TileSet large enough to hold current tiles
int num = Math.max(width, height); int num = Math.max(mMapView.getWidth(), mMapView.getHeight());
int size = Tile.SIZE >> 1; int size = Tile.SIZE >> 1;
int numTiles = (num * num) / (size * size) * 4; int numTiles = (num * num) / (size * size) * 4;
@ -181,8 +178,6 @@ public class TileManager {
mCurrentTiles = new TileSet(numTiles); mCurrentTiles = new TileSet(numTiles);
Log.d(TAG, "max tiles: " + numTiles); Log.d(TAG, "max tiles: " + numTiles);
mInitialized = true;
GLRenderer.drawlock.unlock(); GLRenderer.drawlock.unlock();
} }
@ -612,7 +607,7 @@ public class TileManager {
MapTile tile = null; MapTile tile = null;
if (cnt == maxTiles) { if (cnt == maxTiles) {
Log.d(TAG, "reached maximum tiles " + maxTiles); Log.wtf(TAG, "reached maximum tiles " + maxTiles);
break; break;
} }
int xx = x; int xx = x;