我在while循环中运行一个处理程序,对着lat / lng span,所以如果我在某个范围之外,那个map会自动zoomIn。我正在使用这个完全相同的设置,比较缩放级别而不是跨度,它工作得很好。这就是我正在做的......
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");
}
});
}
执行此代码后,Logcat输出“Thinks we should!” (基本上充斥着原木)无休止地。但它从来没有对我的处理程序做任何事情......实际的zoomIn调用永远不会触发,它只是永远循环,直到我强行关闭我的应用程序。我做错了什么?
答案 0 :(得分:2)
你的处理程序和while循环都在UI线程上执行它们的Runnable
。所以你已经向UI线程处理程序发布了一个bajillion runnables,但这并不重要,因为UI线程忙于执行你的while循环,并且永远无法达到它可以执行你发布到处理程序的runnables的程度。你必须稍微修改你的控制流程才能使它工作 - 也许是这样的:
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;
}
}
}
显然不是一个完整的实现,你可能必须传递runnables的构造函数一些变量等;但希望这对你有好处。