fix hanging UI on MapWorker.pause/.proceed

This commit is contained in:
Hannes Janetzek
2012-08-08 22:43:06 +02:00
parent 165221f42a
commit 4cae011d85
8 changed files with 110 additions and 30 deletions

View File

@@ -93,7 +93,7 @@ public class MapView extends GLSurfaceView {
private IMapRenderer mMapRenderer;
private JobQueue mJobQueue;
private MapWorker mMapWorkers[];
private int mNumMapWorkers = 6;
private int mNumMapWorkers = 4;
private JobParameters mJobParameters;
private DebugSettings mDebugSettings;
private String mMapFile;
@@ -301,15 +301,15 @@ public class MapView extends GLSurfaceView {
/**
* Calculates all necessary tiles and adds jobs accordingly.
*/
public synchronized void redrawTiles() {
if (getWidth() <= 0 || getHeight() <= 0)
public void redrawTiles() {
if (getWidth() > 0 && getHeight() > 0)
return;
mMapRenderer.redrawTiles(false);
}
void clearAndRedrawMapView() {
if (getWidth() <= 0 || getHeight() <= 0)
if (getWidth() > 0 && getHeight() > 0)
return;
mMapRenderer.redrawTiles(true);
@@ -525,7 +525,6 @@ public class MapView extends GLSurfaceView {
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} finally {
mapWorkersProceed();
try {
if (inputStream != null) {
inputStream.close();
@@ -533,7 +532,9 @@ public class MapView extends GLSurfaceView {
} catch (IOException e) {
Log.e(TAG, e.getMessage());
}
mapWorkersProceed();
}
return false;
}
@@ -604,13 +605,13 @@ public class MapView extends GLSurfaceView {
@Override
protected synchronized void onSizeChanged(int width, int height, int oldWidth,
int oldHeight) {
for (MapWorker mapWorker : mMapWorkers) {
mapWorker.pause();
mapWorker.awaitPausing();
super.onSizeChanged(width, height, oldWidth, oldHeight);
mapWorker.proceed();
}
// redrawTiles();
mJobQueue.clear();
mapWorkersPause();
super.onSizeChanged(width, height, oldWidth, oldHeight);
mapWorkersProceed();
}
void destroy() {
@@ -618,6 +619,7 @@ public class MapView extends GLSurfaceView {
// mZoomAnimator.interrupt();
for (MapWorker mapWorker : mMapWorkers) {
mapWorker.pause();
mapWorker.interrupt();
try {
@@ -754,10 +756,12 @@ public class MapView extends GLSurfaceView {
private void mapWorkersPause() {
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing()) {
if (!mapWorker.isPausing())
mapWorker.pause();
}
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing())
mapWorker.awaitPausing();
}
}
}

View File

@@ -28,6 +28,8 @@ public class MapWorker extends PausableThread {
private final IMapGenerator mMapGenerator;
private final IMapRenderer mMapRenderer;
// private final int mPrio;
/**
* @param id
* thread id
@@ -46,6 +48,7 @@ public class MapWorker extends PausableThread {
mMapRenderer = mapRenderer;
THREAD_NAME = "MapWorker" + id;
// mPrio = Math.max(Thread.MIN_PRIORITY + id, Thread.NORM_PRIORITY - 1);
}
public IMapGenerator getMapGenerator() {
@@ -63,7 +66,6 @@ public class MapWorker extends PausableThread {
if (mMapGenerator == null || mapGeneratorJob == null)
return;
// Log.d(THREAD_NAME, "processing: " + mapGeneratorJob.tile);
boolean success = mMapGenerator.executeJob(mapGeneratorJob);
@@ -77,10 +79,15 @@ public class MapWorker extends PausableThread {
return THREAD_NAME;
}
@Override
protected void takeabreak() {
mMapGenerator.getMapDatabase().cancel();
}
@Override
protected int getThreadPriority() {
// return (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2;
return Thread.MIN_PRIORITY;
return (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2;
// return mPrio;
}
@Override

View File

@@ -58,6 +58,7 @@ public abstract class PausableThread extends Thread {
public final synchronized void pause() {
if (!mShouldPause) {
mShouldPause = true;
takeabreak();
notify();
}
}
@@ -116,6 +117,10 @@ public abstract class PausableThread extends Thread {
// do nothing
}
protected void takeabreak() {
// do nothing
}
/**
* Called once at the end of the {@link #run()} method. The default implementation is empty.
*/