проблема памяти с картой Google и оверлеями! - PullRequest
0 голосов
/ 15 октября 2010

Я рисую некоторые наложения на карте Google. Если я слишком много двигаюсь по карте, я получаю эту ошибку:

10-15 14: 43: 43.020: ОШИБКА / dalvikvm-heap (299): внешнее распределение 32768 байт слишком велико для этого процесса. 10-15 14: 43: 43.020: ОШИБКА / GraphicsJNI (299): ВМ не позволяет выделять 32768 байт 10-15 14: 43: 43.260: ОШИБКА / AndroidRuntime (299): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 10-15 14: 43: 43.260: ОШИБКА / AndroidRuntime (299): java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины 10-15 14: 43: 43.260: ОШИБКА / AndroidRuntime (299): на android.graphics.Bitmap.nativeCreate (собственный метод) 10-15 14: 43: 43.260: ОШИБКА / AndroidRuntime (299): на android.graphics.Bitmap.createBitmap (Bitmap.java:468)

В моей куче я вижу, что было использовано менее 30%.

Кто-нибудь может мне помочь? Есть ли выход? Спасибо.

///////////////////////////////////////////////

публичное рисование пустот (холст Canvas, mapView mapv, логическая тень) {

    BusLoc.myMapView.destroyDrawingCache ();
    super.draw(canvas, mapv, shadow);

    Paint mPaint = new Paint();
    mPaint.setDither(true);
    mPaint.setColor(Color.RED);
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(2);

    /////////////////////////////get the lat/long info/////////////////////////////////////

    BusLoc.mapCenter= BusLoc.myMapView.getMapCenter();
    int latCenter = BusLoc.mapCenter.getLatitudeE6();
    int longCenter = BusLoc.mapCenter.getLongitudeE6();
    int latSpan = BusLoc.myMapView.getLatitudeSpan();
    int longSpan = BusLoc.myMapView.getLongitudeSpan();
    int latMax = latCenter + (latSpan / 2);
    int latMin = latCenter - (latSpan / 2);
    int longMax = longCenter + (longSpan / 2);
    int longMin = longCenter - (longSpan / 2);

    ///////////////////////////////////////////////////////////////////////////////////////


    Log.d("MyOverlay","OnDraw");

    int in=0;
    for(in=0;in<ind-1;in++)
    {
        if (ah1[in][0] ==0 ||(ah1[in+1][0]==0)) break;
        if((ah1[in][0] !=0) &&(ah1[in+1][0]!=0))
        {
            GeoPoint gP1 = new GeoPoint((int)(ah1[in][0]*1e6),(int)(ah1[in][1]*1e6)); //lat,lng
            GeoPoint gP2 = new GeoPoint((int)(ah1[in+1][0]*1e6),(int)(ah1[in+1][1]*1e6));



            Point p1 = new Point();
            Point p2 = new Point();

            Path path = new Path();

            Projection projection = BusLoc.myMapView.getProjection();
            projection.toPixels(gP1, p1);
            projection.toPixels(gP2, p2);

            path.moveTo(p2.x, p2.y);
            path.lineTo(p1.x,p1.y);

            if((((ah1[in][0]<=latMax)&&(ah1[in][0]>=latMin))&&((ah1[in][1]<=longMax)&&(ah1[in][1]>=longMin))) || (((ah1[in+1][0]<=latMax)&&(ah1[in+1][0]>=latMin))&&((ah1[in+1][1]<=longMax)&&(ah1[in+1][1]>=longMin))) )
            {
                canvas.drawPath(path, mPaint);
            }

            Log.d("MyOverlay","drawn: "+gP1.toString()+":"+gP2.toString());
        }
    }
   // BusLoc.myMapView.destroyDrawingCache ();
}

1 Ответ

2 голосов
/ 15 октября 2010

Вы должны явно рисовать только те наложения, которые видны на вашем экране, если не все наложения нарисованы, видите ли вы их или нет, это не только вызывает проблемы с памятью, но и делает перемещение карты очень медленным на не оченьхорошие устройства.

MapController mapControl = map.getController();
        GeoPoint mapCenter = map.getMapCenter();
        int latCenter = mapCenter.getLatitudeE6();
        int longCenter = mapCenter.getLongitudeE6();
        int latSpan = map.getLatitudeSpan();
        int longSpan = map.getLongitudeSpan();
        int latMax = latCenter + (latSpan / 2);
        int latMin = latCenter - (latSpan / 2);
        int longMax = longCenter + (longSpan / 2);
        int longMin = longCenter - (longSpan / 2);

Напишите некоторый код, чтобы определить, находится ли ваша достопримечательность в пределах этого диапазона просмотра, если она нарисована, если нет.

Я бы также предположил, что вы используете небольшой индикатор наложения, они могут быть очень маленькими и с низким разрешением без потери качества.

...