gwt: LoadDelayTask, keep refs with task

This commit is contained in:
Hannes Janetzek 2014-03-23 02:44:27 +01:00
parent 72b2349e11
commit fd941858dd
4 changed files with 43 additions and 31 deletions

View File

@ -1,10 +1,20 @@
package org.oscim.layers.tile; package org.oscim.layers.tile;
import org.oscim.renderer.MapRenderer; import org.oscim.renderer.MapRenderer;
import org.oscim.tiling.ITileDataSink;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
public abstract class LoadDelayTask implements Runnable { public abstract class LoadDelayTask<T> implements Runnable {
protected final MapTile tile;
protected final ITileDataSink sink;
protected final T data;
public LoadDelayTask(MapTile tile, ITileDataSink sink, T data) {
this.tile = tile;
this.sink = sink;
this.data = data;
}
@Override @Override
public void run() { public void run() {

View File

@ -113,7 +113,7 @@ public abstract class TileLoader implements ITileDataSink {
boolean success = (result == SUCCESS) && !isInterrupted; boolean success = (result == SUCCESS) && !isInterrupted;
long now = MapRenderer.frametime; long now = MapRenderer.frametime;
log.debug("completed {} diff time:{}", mTile, (now - lastLoadTime)); //log.debug("completed {} diff time:{}", mTile, (now - lastLoadTime));
lastLoadTime = now; lastLoadTime = now;
mTileManager.jobCompleted(mTile, success); mTileManager.jobCompleted(mTile, success);
@ -148,7 +148,7 @@ public abstract class TileLoader implements ITileDataSink {
} }
public static void postLoadDelay(LoadDelayTask task) { public static void postLoadDelay(LoadDelayTask<?> task) {
Gdx.app.postRunnable(task); Gdx.app.postRunnable(task);
} }

View File

@ -20,6 +20,7 @@ import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import org.oscim.layers.tile.LoadDelayTask;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileLoader;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
@ -61,30 +62,32 @@ public class UrlTileDataSource implements ITileDataSource {
} }
public void process(final InputStream is) { public void process(final InputStream is) {
TileLoader.postLoadDelay(new org.oscim.layers.tile.LoadDelayTask() { TileLoader.postLoadDelay(new LoadDelayTask<InputStream>(mTile, mSink, is) {
@Override @Override
public void continueLoading() { public void continueLoading() {
if (!mTile.state(MapTile.State.LOADING)) {
mConn.requestCompleted(); if (tile.state(MapTile.State.LOADING)) {
mSink.completed(FAILED);
mTile = null;
mSink = null;
}
boolean win = false; boolean win = false;
if (is != null) { if (is != null) {
try { try {
win = mTileDecoder.decode(mTile, mSink, is); win = mTileDecoder.decode(tile, sink, data);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
if (!win) if (!win)
log.debug("{} failed", mTile); log.debug("{} failed", tile);
// FIXME
mConn.requestCompleted(); mConn.requestCompleted();
mSink.completed(win ? SUCCESS : FAILED); sink.completed(win ? SUCCESS : FAILED);
} else {
// FIXME
mConn.requestCompleted();
sink.completed(FAILED);
}
mTile = null; mTile = null;
mSink = null; mSink = null;

View File

@ -1,12 +1,11 @@
package org.oscim.tiling.source.bitmap; package org.oscim.tiling.source.bitmap;
import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED;
import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS;
import org.oscim.gdx.client.GwtBitmap; import org.oscim.gdx.client.GwtBitmap;
import org.oscim.layers.tile.LoadDelayTask;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileLoader;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSink.QueryResult;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.source.LwHttp; import org.oscim.tiling.source.LwHttp;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -76,16 +75,16 @@ public class BitmapTileSource extends UrlTileSource {
img.addLoadHandler(new LoadHandler() { img.addLoadHandler(new LoadHandler() {
public void onLoad(LoadEvent event) { public void onLoad(LoadEvent event) {
TileLoader.postLoadDelay(new org.oscim.layers.tile.LoadDelayTask() { TileLoader.postLoadDelay(new LoadDelayTask<Image>(tile, sink, img) {
@Override @Override
public void continueLoading() { public void continueLoading() {
if (!tile.state(MapTile.State.LOADING)) { if (!tile.state(MapTile.State.LOADING)) {
sink.completed(FAILED); sink.completed(QueryResult.FAILED);
RootPanel.get().remove(img); RootPanel.get().remove(data);
} else { } else {
sink.setTileImage(new GwtBitmap(img)); sink.setTileImage(new GwtBitmap(data));
sink.completed(SUCCESS); sink.completed(QueryResult.SUCCESS);
} }
} }
}); });
@ -96,7 +95,7 @@ public class BitmapTileSource extends UrlTileSource {
@Override @Override
public void onError(ErrorEvent event) { public void onError(ErrorEvent event) {
sink.completed(FAILED); sink.completed(QueryResult.FAILED);
RootPanel.get().remove(img); RootPanel.get().remove(img);
} }
}); });