0

私はを使用していMapActivityます。JSONを使用してWebサーバーからGeoPointのセットを取得し、それを解析してポリラインコードをジオポイント(緯度と経度)にデコードし、に保存しArrayList<Geopoints>ます。

これらのポイントは、に描画されますMapActivity

私の問題は、私のArrayList<Geopoints>サイズが2000を超えているため、効率的に実行されていないことです。どうすれば効率を上げることができますか?

描画中に行ったサンプルコードは

ArrayList'<'Geopoints> mGeoPoints;

サイズを言うmGeoPoints=2000;

オーバーレイによって拡張されたクラス。そのクラスのいくつかのメソッドは、私がどのように書いているかです。

public boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when) {
       super.draw(canvas, mapView, shadow, when);
        drawPath(mapView, canvas);
        return true;
    }

public void drawPath(MapView mv, Canvas canvas) {
        int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
                for (int i = 0; i < mGeoPoints.size(); i++) {
            Point point = new Point();
            mv.getProjection().toPixels(mGeoPoints.get(i), point);
            x2 = point.x;
            y2 = point.y;
            if (i > 0) {
                canvas.drawLine(x1, y1, x2, y2, paint);
            }
            x1 = x2;
            y1 = y2;
        }
    }

このコードは正常に機能しています。地図上に正しく描画されます。地図をズームしたり移動したりすると、地図アプリケーションがハングします。

ズームレベルを16に設定しましたmapController.setZoom(16);。誰かが私を助けることができますか?ユーザーが手でズームしても高速に動作するようにします。

4

1 に答える 1

4

i < mGeoPoints.size();私に本当に飛び出す最初の2つのことはPoint point = new Point();

配列の長さをローカル変数に格納することで、これらの両方を最適化できます。重要なのは、変数ポイントを再利用することです。ドローループごとに2000回新しいインスタンスを作成すると、携帯電話が細かく砕かれます。

また、getProjection(...)メソッドが渡されたポイントを再利用することを確認してください。ポイント値が適切にリセットされている限り、次のようなものを使用できます。

Point point = new Point();

for (int i = 0; i < mGeoPoints.size(); i++) 
{
    mv.getProjection().toPixels(mGeoPoints.get(i), point);
    x2 = point.x;
    y2 = point.y;
    if (i > 0) 
    {
        canvas.drawLine(x1, y1, x2, y2, paint);
    }
}
于 2011-07-26T14:59:56.227 に答える