TileGenerator _is_ a MapWorker, extract TileGenerator interface

This commit is contained in:
Hannes Janetzek 2013-04-22 13:16:15 +02:00
parent fbb4d1d2ae
commit 170fc76991
4 changed files with 94 additions and 64 deletions

View File

@ -0,0 +1,26 @@
/*
* Copyright 2013 Hannes Janetzek
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.layers.tile;
public interface ITileGenerator {
/**
* Load data for 'tile' and file tile.layers for rendering.
* (executed on MapWorker threads)
*/
public abstract boolean executeJob(MapTile tile);
public abstract void cleanup();
}

View File

@ -1,6 +1,7 @@
/*
* Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2013 Hannes Hannes Janetzek
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
@ -20,10 +21,9 @@ import org.oscim.utils.PausableThread;
* A MapWorker uses a {@link TileGenerator} to generate map tiles. It runs in a
* separate thread to avoid blocking the UI thread.
*/
public class MapWorker extends PausableThread {
public abstract class MapWorker extends PausableThread {
private final String THREAD_NAME;
private final JobQueue mJobQueue;
private final TileGenerator mMapGenerator;
private final TileManager mTileManager;
/**
@ -31,31 +31,18 @@ public class MapWorker extends PausableThread {
* thread id
* @param jobQueue
* ...
* @param tileGenerator
* ...
* @param tileManager
* ...
*/
public MapWorker(int id, JobQueue jobQueue, TileGenerator tileGenerator,
TileManager tileManager) {
public MapWorker(int id, JobQueue jobQueue, TileManager tileManager) {
super();
mJobQueue = jobQueue;
mMapGenerator = tileGenerator;
mTileManager = tileManager;
THREAD_NAME = "MapWorker" + id;
}
public TileGenerator getTileGenerator() {
return mMapGenerator;
}
@Override
protected void afterRun() {
// empty
}
@Override
protected void doWork() {
MapTile tile = mJobQueue.poll();
@ -64,17 +51,20 @@ public class MapWorker extends PausableThread {
return;
try {
mMapGenerator.executeJob(tile);
executeJob(tile);
} catch (Exception e) {
e.printStackTrace();
return;
}
if (!isInterrupted()) {
// pass tile to main thread
mTileManager.passTile(tile);
}
}
protected abstract boolean executeJob(MapTile tile);
@Override
protected String getThreadName() {
return THREAD_NAME;

View File

@ -58,7 +58,7 @@ import android.util.Log;
* 5. RenderTheme calls IRenderCallback functions with style information
* 6. Styled items become added to MapTile.layers... roughly
*/
public class TileGenerator implements IRenderCallback, IMapDatabaseCallback {
public class TileGenerator extends MapWorker implements IRenderCallback, IMapDatabaseCallback, ITileGenerator {
private static final String TAG = TileGenerator.class.getName();
@ -117,7 +117,9 @@ public class TileGenerator implements IRenderCallback, IMapDatabaseCallback {
/**
*/
public TileGenerator() {
public TileGenerator(int id, JobQueue jobQueue, TileManager tileManager) {
super(id, jobQueue, tileManager);
mClipper = new LineClipper(0, 0, Tile.SIZE, Tile.SIZE, true);
MapElement m = mDebugWay = new MapElement();
@ -137,15 +139,24 @@ public class TileGenerator implements IRenderCallback, IMapDatabaseCallback {
m.geometryType = GEOM_POINT;
}
/* (non-Javadoc)
* @see org.oscim.layers.tile.ITileGenerator#cleanup()
*/
@Override
public void cleanup() {
mMapDatabase.close();
}
public boolean executeJob(MapTile MapTile) {
/* (non-Javadoc)
* @see org.oscim.layers.tile.ITileGenerator#executeJob(org.oscim.layers.tile.MapTile)
*/
@Override
public boolean executeJob(MapTile mapTile) {
if (mMapDatabase == null)
return false;
mTile = (MapTile) MapTile;
mTile = mapTile;
if (mTile.layers != null) {
// should be fixed now.

View File

@ -49,38 +49,34 @@ public class TileLayer extends Layer {
private final TileManager mTileManager;
private final JobQueue mJobQueue;
// TODO use 1 download and 1 generator thread instead
private final MapWorker mMapWorkers[];
private final int mNumMapWorkers = 4;
private final TileGenerator mTileGenerators[];
private final int mNumTileWorker = 4;
private final TileGenerator mTileWorker[];
public TileLayer(MapView mapView) {
super(mapView);
mTileManager = new TileManager(mapView, this);
mJobQueue = new JobQueue();
mMapWorkers = new MapWorker[mNumMapWorkers];
mTileGenerators = new TileGenerator[mNumMapWorkers];
mTileWorker = new TileGenerator[mNumTileWorker];
TileGenerator.setDebugSettings(mapView.getDebugSettings());
for (int i = 0; i < mNumMapWorkers; i++) {
mTileGenerators[i] = new TileGenerator();
mMapWorkers[i] = new MapWorker(i, mJobQueue, mTileGenerators[i], mTileManager);
mMapWorkers[i].start();
for (int i = 0; i < mNumTileWorker; i++) {
mTileWorker[i] = new TileGenerator(i, mJobQueue, mTileManager);
mTileWorker[i].start();
}
mLayer = new TileRenderLayer(mapView, mTileManager);
}
public TileRenderLayer getTileLayer(){
return (TileRenderLayer)mLayer;
public TileRenderLayer getTileLayer() {
return (TileRenderLayer) mLayer;
}
@Override
public void onUpdate(MapPosition mapPosition, boolean changed) {
if (mClearMap){
if (mClearMap) {
mTileManager.init(mMapView.getWidth(), mMapView.getHeight());
mClearMap = false;
changed = true;
@ -90,19 +86,20 @@ public class TileLayer extends Layer {
mTileManager.update(mapPosition);
}
@Override
public void destroy(){
public void destroy() {
mTileManager.destroy();
for (MapWorker mapWorker : mMapWorkers) {
mapWorker.pause();
mapWorker.interrupt();
for (TileGenerator tileWorker : mTileWorker) {
tileWorker.pause();
tileWorker.interrupt();
mapWorker.getTileGenerator().getMapDatabase().close();
//tileWorker.getMapDatabase().close();
tileWorker.cleanup();
try {
mapWorker.join(10000);
tileWorker.join(10000);
} catch (InterruptedException e) {
// restore the interrupted status
Thread.currentThread().interrupt();
@ -132,15 +129,15 @@ public class TileLayer extends Layer {
if (mMapOptions != null && mMapOptions.equals(options))
return true;
mapWorkersPause(true);
tileWorkersPause(true);
mJobQueue.clear();
mMapOptions = options;
mMapDatabase = null;
for (int i = 0; i < mNumMapWorkers; i++) {
MapWorker mapWorker = mMapWorkers[i];
for (int i = 0; i < mNumTileWorker; i++) {
//TileGenerator tileWorker = mTileWorker[i];
IMapDatabase mapDatabase = MapDatabaseFactory
.createMapDatabase(options.db);
@ -151,8 +148,10 @@ public class TileLayer extends Layer {
Log.d(TAG, "failed open db: " + result.getErrorMessage());
}
TileGenerator tileGenerator = mapWorker.getTileGenerator();
tileGenerator.setMapDatabase(mapDatabase);
mTileWorker[i].setMapDatabase(mapDatabase);
//TileGenerator tileGenerator = tileWorker.getTileGenerator();
//tileGenerator.setMapDatabase(mapDatabase);
// TODO this could be done in a cleaner way..
if (mMapDatabase == null)
@ -168,7 +167,7 @@ public class TileLayer extends Layer {
clearMap();
mapWorkersProceed();
tileWorkersProceed();
return true;
}
@ -203,9 +202,11 @@ public class TileLayer extends Layer {
return mapPosition;
}
public String getRenderTheme() {
return mRenderTheme;
}
/**
* Sets the internal theme which is used for rendering the map.
*
@ -232,6 +233,7 @@ public class TileLayer extends Layer {
return ret;
}
/**
* Sets the theme file which is used for rendering the map.
*
@ -258,7 +260,7 @@ public class TileLayer extends Layer {
private boolean setRenderTheme(Theme theme) {
mapWorkersPause(true);
tileWorkersPause(true);
InputStream inputStream = null;
try {
@ -269,7 +271,7 @@ public class TileLayer extends Layer {
// FIXME !!!
GLRenderer.setRenderTheme(t);
for (TileGenerator g : mTileGenerators)
for (TileGenerator g : mTileWorker)
g.setRenderTheme(t);
return true;
@ -287,12 +289,13 @@ public class TileLayer extends Layer {
} catch (IOException e) {
Log.e(TAG, e.getMessage());
}
mapWorkersProceed();
tileWorkersProceed();
}
return false;
}
/**
* add jobs and remember MapWorkers that stuff needs to be done
* add jobs and remember TileGenerators that stuff needs to be done
*
* @param jobs
* tile jobs
@ -304,29 +307,29 @@ public class TileLayer extends Layer {
}
mJobQueue.setJobs(jobs);
for (int i = 0; i < mNumMapWorkers; i++) {
MapWorker m = mMapWorkers[i];
for (int i = 0; i < mNumTileWorker; i++) {
TileGenerator m = mTileWorker[i];
synchronized (m) {
m.notify();
}
}
}
private void mapWorkersPause(boolean wait) {
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing())
mapWorker.pause();
private void tileWorkersPause(boolean wait) {
for (TileGenerator tileWorker : mTileWorker) {
if (!tileWorker.isPausing())
tileWorker.pause();
}
if (wait) {
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing())
mapWorker.awaitPausing();
for (TileGenerator tileWorker : mTileWorker) {
if (!tileWorker.isPausing())
tileWorker.awaitPausing();
}
}
}
private void mapWorkersProceed() {
for (MapWorker mapWorker : mMapWorkers)
mapWorker.proceed();
private void tileWorkersProceed() {
for (TileGenerator tileWorker : mTileWorker)
tileWorker.proceed();
}
}