【问题标题】:memory problem with google map and overlays !谷歌地图和覆盖的内存问题!
【发布时间】: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


【解决方案1】:

您应该明确地只绘制屏幕上可见的叠加层,如果不是所有的叠加层都被绘制,无论您是否看到它们,这不仅会导致内存问题,而且会使移动地图变得非常缓慢好设备。

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);

编写一些代码来检测您的兴趣点是否在该查看范围内,如果是绘制它,如果不是不。

我还假设您使用的是小型叠加指示器,它们可以非常小且 dpi 低而不会降低质量。

【讨论】:

  • 非常感谢@blindstuff ..我非常感谢您的帮助。我现在将研究这个想法,并尝试看看这是否有帮助。谢谢。
  • 嗨...对不起它不工作..它推迟了错误直到更远..但有时它有同样的问题。我将绘制代码附加到问题中。 !
  • 这很奇怪,您的代码看起来不错。我会尝试绘制一个可绘制对象而不是一条线,只是任何随机图像,如果你想在起点和终点绘制一个可绘制对象,以查看错误是在使用绘制创建线还是在它自己的地图上。
  • @Blindstuff:代码对我来说不是很方便……我的意思是……因为,我正在画线……即使这两个点不在视图中……线可能在视图内...由于线条图非常重要...所以....我不能使用您的代码....但是感谢代码示例,我可以用它来覆盖...东西..(而不是画线).. :)
  • 你找出问题所在了吗?如果至少有一个点在屏幕上,您应该只绘制,但当两个点都不在屏幕上时不要绘制线。我有一个应用程序覆盖了大约 7000 个点,仅仅因为这个变化,它就从不完善变成了完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2021-01-03
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多