1

lat/lng スパンに対して while ループ内でハンドラを実行しているため、特定のスパンの外にいる場合、そのマップは自動的にズームインします。私はこれとまったく同じ設定を使用しており、スパンではなくズーム レベルを比較していますが、問題なく動作します。これが私がやっていることです...

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 呼び出しは起動せず、アプリケーションを強制終了するまで永遠にループします。私は何を間違っていますか?

4

1 に答える 1

2

ハンドラーと while ループは両方ともRunnable、UI スレッドで を実行しています。膨大な数のランナブルを UI スレッド ハンドラーに投稿しましたが、それは問題ではありません。なぜなら、UI スレッドは while ループの実行でビジーであり、ハンドラーに投稿したランナブルを実行できるポイントに到達しないためです。 . これを機能させるには、制御の流れを多少変更する必要があります。おそらく次のようになります。

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;
    }
  }
}

明らかに完全な実装ではありません。ランナブルのコンストラクターにいくつかの変数などを渡す必要があるかもしれません。うまくいけば、これはあなたにとって少しうまくいくでしょう。

于 2012-08-23T19:43:42.537 に答える