Issue
I'm running a handler inside of a while loop, against a lat/lng span so if i'm outside of a certain span, that map will automatically zoomIn. I'm using this exact same setup, comparing zoom levels instead of spans and it works just fine. Here's what I'm doing...
public static void smoothZoomToSpan(final MapController controller,
MapView v, GeoPoint center, int latitudeSpan, int longitudeSpan) {
final Handler handler = new Handler();
final MapView mapView = v;
final int currentLatitudeSpan = v.getLatitudeSpan();
final int currentLongitudeSpan = v.getLongitudeSpan();
final int targetLatitudeSpan = latitudeSpan;
final int targetLongitudeSpan = longitudeSpan;
controller.animateTo(center, new Runnable() {
public void run() {
int curLatSpan = currentLatitudeSpan;
int curLngSpan = currentLongitudeSpan;
int tarLatSpn = targetLatitudeSpan;
int tarLngSpan = targetLongitudeSpan;
long delay = 0;
while ((curLatSpan - 6000 > tarLatSpn)
|| (curLngSpan - 6000 > tarLngSpan)) {
Log.e("ZoomIn", "Thinks we should!");
handler.postDelayed(new Runnable() {
@Override
public void run() {
controller.zoomIn();
Log.e("ZoomIn", "Zoomed");
}
}, delay);
delay += 150; // Change this to whatever is good on the
// device
}
Log.e("ZoomIn", "completed");
}
});
}
After I execute this code, Logcat outputs "Thinks we should!" (basically flooding the logs) endlessly. But it never does anything with my handler... the actual zoomIn call never fires, and it just loops forever until I force-close my application. What am I doing wrong?
Solution
Your handler and the while loop are both executing their Runnables on the UI thread. So you've posted a bajillion runnables to the UI thread handler, but it doesn't matter, because the UI thread is busy executing your while loop and never gets to the point where it can execute the runnables you've posted to the handler. You'll have to modify your flow of control somewhat to get this to work - perhaps something like this:
public static void smoothZoomToSpan(final MapController controller,
MapView v, GeoPoint center, int latitudeSpan, int longitudeSpan) {
controller.animateTo(center, new Runnable());
}
private class ExecuteZoom implements Runnable {
static long delay;
@Override
public void run() {
if ((curLatSpan - 6000 > tarLatSpn)
|| (curLngSpan - 6000 > tarLngSpan)) {
handler.postDelayed(new ExecuteZoom(), delay);
delay += 150;
}
}
}
Clearly not a complete implementation, you might have to pass the constructor of the runnables some variables, etc; but hopefully this works out a bit better for you.
Answered By - JRaymond
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.