diff options
author | Keith Packard <keithp@keithp.com> | 2016-05-05 02:25:52 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2016-05-05 02:25:52 -0700 |
commit | e0081f7ba6fc9f1e4484d3e291fd30065ad5b620 (patch) | |
tree | fabb5b36eb80705e75b83a8ef148e27e9e7fdd8d /altoslib/AltosMapTile.java | |
parent | 13179f614a99cad3016832ac1b365eaa4208c10f (diff) |
altoslib: Fix map preloading callbacks, run in separate thread
The map storage and tile callbacks were muddled together. Create
clearly separate states for map data and have status updates be
delivered when registering for new status events so that registration
is sufficient to track the state without an explicit call to get the
current state.
Run the map tile creation in a separate thread so that even checking
status of files on disk runs out of the UI thread.
These fixes serve to make the pacifier update more smoothly, and also
not over/under count tile loading so that the loading actually
completes when all of the tiles are loaded.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosMapTile.java')
-rw-r--r-- | altoslib/AltosMapTile.java | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/altoslib/AltosMapTile.java b/altoslib/AltosMapTile.java index 076c5937..fdc8ff65 100644 --- a/altoslib/AltosMapTile.java +++ b/altoslib/AltosMapTile.java @@ -20,22 +20,23 @@ package org.altusmetrum.altoslib_10; import java.io.*; import java.util.*; -public abstract class AltosMapTile implements AltosFontListener { - AltosMapTileListener listener; +public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreListener { + LinkedList<AltosMapTileListener> listeners = new LinkedList<AltosMapTileListener>(); public AltosLatLon upper_left, center; public int px_size; int zoom; int maptype; int scale; + private AltosMapCache cache; public AltosMapStore store; - public AltosMapCache cache; public int status; - static public final int success = 0; - static public final int loading = 1; - static public final int failed = 2; - static public final int bad_request = 3; - static public final int forbidden = 4; + static public final int loaded = 0; /* loaded from file */ + static public final int fetched = 1; /* downloaded to file */ + static public final int fetching = 2; /* downloading from net */ + static public final int failed = 3; /* loading from file failed */ + static public final int bad_request = 4;/* downloading failed */ + static public final int forbidden = 5; /* downloading failed */ private File map_file() { double lat = center.lat; @@ -79,33 +80,46 @@ public abstract class AltosMapTile implements AltosFontListener { public void font_size_changed(int font_size) { } - public void set_status(int status) { + private synchronized void notify_listeners(int status) { this.status = status; - listener.notify_tile(this, status); + for (AltosMapTileListener listener : listeners) + listener.notify_tile(this, status); } - public void notify_image(AltosImage image) { - listener.notify_tile(this, status); + public void notify_store(AltosMapStore store, int status) { +// System.out.printf("AltosMapTile.notify_store %d\n", status); + notify_listeners(status); } - public int store_status() { - return store.status(); + public void notify_image(AltosImage image) { + if (image == null) + status = failed; + else + status = loaded; + notify_listeners(status); } - public void add_store_listener(AltosMapStoreListener listener) { - store.add_listener(listener); + public abstract void paint(AltosMapTransform t); + + public AltosImage get_image() { + if (cache == null) + return null; + return cache.get(this); } - public void remove_store_listener(AltosMapStoreListener listener) { - store.remove_listener(listener); + public synchronized void add_listener(AltosMapTileListener listener) { + if (!listeners.contains(listener)) + listeners.add(listener); + listener.notify_tile(this, status); } - public abstract void paint(AltosMapTransform t); + public synchronized void remove_listener(AltosMapTileListener listener) { + listeners.remove(listener); + } - public AltosMapTile(AltosMapTileListener listener, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { - this.listener = listener; + public AltosMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { + this.cache = cache; this.upper_left = upper_left; - this.cache = listener.cache(); while (center.lon < -180.0) center.lon += 360.0; @@ -118,11 +132,11 @@ public abstract class AltosMapTile implements AltosFontListener { this.px_size = px_size; this.scale = scale; - status = AltosMapTile.loading; store = AltosMapStore.get(map_url(), map_file()); + store.add_listener(this); } - public AltosMapTile(AltosMapTileListener listener, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { - this(listener, upper_left, center, zoom, maptype, px_size, 1); + public AltosMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { + this(cache, upper_left, center, zoom, maptype, px_size, 1); } } |