【发布时间】:2010-10-15 14:58:29
【问题描述】:
我正在谷歌地图上绘制一些叠加层。如果我在地图上移动太多,我会收到此错误:
10-15 14:43:43.020:错误/dalvikvm-heap(299):32768 字节的外部分配对于此进程来说太大。 10-15 14:43:43.020: 错误/GraphicsJNI(299): VM 不允许我们分配 32768 字节 10-15 14:43:43.260:错误/AndroidRuntime(299):致命异常:主要 10-15 14:43:43.260: 错误/AndroidRuntime(299): java.lang.OutOfMemoryError: 位图大小超出 VM 预算 10-15 14:43:43.260: 错误/AndroidRuntime(299): 在 android.graphics.Bitmap.nativeCreate(Native Method) 10-15 14:43:43.260: 错误/AndroidRuntime(299): 在 android.graphics.Bitmap.createBitmap(Bitmap.java:468)
在我的堆中,我可以看到不到 30% 已被使用。
谁能帮帮我?有出路吗 ?谢谢。
///////////////////////////////////////
public void draw(Canvas canvas, MapView mapv, boolean shadow){
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 ();
}
【问题讨论】:
-
您如何看到仅使用了 30% 的堆?位图不使用 jvm 堆,而是使用本机堆。在stackoverflow.com/questions/3238388/…查看我的回复
-
谢谢@Mathias Lin ..也会尝试你的想法..让你知道它有什么帮助......顺便说一句......只是为了让你知道..我对堆的东西很兴奋因为,以前我的稀疏数组编码效率低下,这意味着堆使用率为 90% 或更多……现在只有 30%,我希望它会更好!
-
@Mathias Lin:这是我在出错之前得到的!!
-
10-16 13:33:10.548: INFO/System.out(1596): alloc: 6.912223815917969 : available: 7.0703125 请建议我能做什么。谢谢。
-
还有这个 ...10-16 13:40:01.658: INFO/System.out(1661): alloc: 7.0171661376953125 : 可用: 7.10546875
标签: android memory google-maps overlay