0

デバイスの現在の場所とともに、マップビューにいくつかの「興味のある場所」を表示する必要がある Android アプリケーションを開発しています。これはうまくいきます。また、私のアプリでは、ユーザーは「興味のある場所」マーカーを「タップ」でき、アプリケーションはそのマーカーへのルートを描画する必要があります。

Google Directions API を使用してルートを取得し、ポリライン デコーダーを使用してユーザーと場所の間の GeoPoints を取得しました。私のテスト ルートでは、Google は約 200 の異なる 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) をクリアします。次に、現在の場所と「関心のある場所」のオーバーレイをリストに追加します。最後に、ルート オーバーレイを追加します。

問題は、突然動作が非常に遅くなり、最終的にクラッシュすることです。しかし、LogCat にはメッセージがありません。したがって、30 のオーバーレイ + 1 + ルートの 200 を超えるオーバーレイは、電話で処理するには多すぎると考えました。しかし、私が見たチュートリアルでは、このように...

私が何か間違ったことをした場合、誰かが私に言うことができますか? 前もって感謝します。

4

1 に答える 1

0

私は自分が間違っていたことを理解しました。

drawPath 関数を呼び出すと、GeoPoint のリストを取得した後、各ポイントの座標を確認するループを作成しました。何かのようなもの

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

drawPath 関数が N 回呼び出されました。そのため、デバイスがクラッシュしました。私のせいです。午前 2 時のプログラミングは、コードにとって良くありません。

于 2012-11-29T15:02:46.393 に答える