Я рисую несколько оверлеев на карте Google. Если я слишком много перемещаюсь по карте, я получаю такую ошибку:
10-15 14: 43: 43.020: ERROR / dalvikvm-heap (299): 32768-байтное внешнее выделение слишком велико для этого процесса. 10-15 14: 43: 43.020: ERROR / GraphicsJNI (299): VM не позволяет нам выделить 32768 байт 10-15 14: 43: 43.260: ERROR / AndroidRuntime (299): FATAL EXCEPTION: main 10-15 14: 43: 43.260: ERROR / AndroidRuntime (299): java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины 10-15 14: 43: 43.260: ERROR / AndroidRuntime (299): at android.graphics.Bitmap.nativeCreate (собственный метод) 10-15 14: 43: 43.260: ОШИБКА / AndroidRuntime (299): в android.graphics.Bitmap.createBitmap (Bitmap.java:468)
В своей куче я вижу, что израсходовано менее 30%.
Может кто-нибудь мне помочь ? Есть выход? Спасибо.
///////////////////////////////////////////////
public void draw (Canvas 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 ();
}
Path
s, от этого вы не получите никакого аппаратного ускорения. используйте вместо этогоdrawLines()
. Он использует массивfloat
вместоPath
s и намного быстрее с точки зрения производительности. - person ubuntudroid   schedule 05.03.2013