2012-11-29 82 views
0

我正在開發一個Android應用程序,該應用程序必須在設備當前位置顯示一些地圖上的「興趣點」。這很好。 另外,在我的應用程序中,用戶可以「點擊」一個「感興趣的地方」標記,並且應用程序將不得不繪製路線到該標記。Android中的繪製路線摺疊設備

我使用Google Directions api獲取路線,以及一個折線解碼器來獲取用戶和地點之間的GeoPoints。對於我的測試路線,谷歌給了我大約200個不同的GeoPoints。

所以,我有這樣一個類來添加這些GeoPoints:

public class RouteOverlay extends Overlay { 
    private GeoPoint gp1; 
    private GeoPoint gp2; 
    private int color; 

    public RouteOverlay(GeoPoint gp1, GeoPoint gp2, int color) { 
     this.gp1 = gp1; 
     this.gp2 = gp2; 
     this.color = color; 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     Projection projection = mapView.getProjection(); 
     Paint paint = new Paint(); 
     Point point = new Point(); 
     projection.toPixels(gp1, point); 
     paint.setColor(color); 
     Point point2 = new Point(); 
     projection.toPixels(gp2, point2); 
     paint.setStrokeWidth(5); 
     paint.setAlpha(120); 
     canvas.drawLine(point.x, point.y, point2.x, point2.y, paint); 
     super.draw(canvas, mapView, shadow); 
    } 

} 

我做什麼來繪製路線如下: 1)檢測onClick事件在地圖上的標記。 2)從這個事件中,我創建了一個新線程,在那裏我調用Google API。 3)一旦我有結果,我解析/轉換它在一個GeoPoint列表。 4)然後,我打電話給我的drawPath方法:

private void drawPath(List<GeoPoint> geoPoints, int color) {  
    mapOverlays.clear(); 
    mapOverlays.add(myLocationOverlay); 
    mapOverlays.add(itemizedoverlay); 
    for (int i = 1; i < geoPoints.size(); i++) {    
    mapOverlays.add(new RouteOverlay(geoPoints.get(i - 1), geoPoints.get(i), color)); 
    } 
    mapView.postInvalidate(); 

5)最後,我返回到UI線程。

此方法將清除地圖疊加列表(mapOverlays)。然後,在列表中添加當前位置和「感興趣的地點」疊加層。最後,添加路由覆蓋。

問題是,突然,工作veeery緩慢,最後崩潰。但LogCat中沒有消息。所以,我認爲這條路線上的30個覆蓋層+ 1 + 200多個電話太多了,無法處理。但我見過的教程這樣做...

有人可以告訴我,如果我做錯了什麼嗎? 在此先感謝。

回答

0

我想出了我做錯了什麼。

當我調用drawPath函數時,在獲取GeoPoints列表後,我做了一個循環來檢查每個點的座標。類似於

for (int i = 0; i < geoList.size(); i++){ 
    Log.i("GEOPOINT " + i, geoList.get(i).toString()); 
    drawpath(geoList, Color.BLUE); 
} 

drawPath函數被調用了N次。所以該設備墜毀。我的錯。 凌晨2:00編程對代碼不好!