2012-08-23 75 views
1

我正在一個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調用永遠不會觸發,並且它會一直循環直到我強制關閉我的應用程序。我究竟做錯了什麼?

回答

2

您的處理程序和while循環都在UI線程上執行它們的Runnable。所以你已經向UI線程處理器發佈了一個bajillion runnables,但這沒關係,因爲UI線程忙於執行你的while循環,並且永遠不會到達它可以執行你發佈到處理器的runnable的地步。你必須修改你的控制流有些得到這個工作 - 也許是這樣的:

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

顯然不是一個完整的實現,則可能必須通過可運行的構造一些變量等;但希望這對你有所幫助。

+0

這聽起來像它可能是問題。你能舉一個更好的實現的例子嗎? – RyanInBinary

+0

@RyanInBinary完成 - 有點在遞歸函數的性質 - 我沒有做任何事情,但希望它會讓你去 – JRaymond

+0

這只是讓我更陷入困境。我不知道如何解釋你發佈的內容。我很感激幫助,但它所做的只是爲我創造了很多錯誤,我現在無法完成。我不是在尋找複製/粘貼的答案,但我無法讓你的代碼工作,我對這個過程的整合還不夠了解。 – RyanInBinary