【问题标题】:Fatal Exception: java.lang.OutOfMemoryError When add Polyline to google map致命异常:java.lang.OutOfMemoryError 将折线添加到谷歌地图时
【发布时间】:2019-04-29 03:29:44
【问题描述】:

我有一个在移动时跟踪位置的应用程序,每 5 秒我发送广播接收器在谷歌地图中绘制一条折线,我使用以下方法:

    ArrayList<Location> locationList = Service.locationList;

    if (locationList.size() == 2) {
        Location fromLocation = locationList.get(0);
        Location toLocation = locationList.get(1);

        LatLng from = new LatLng(((fromLocation.getLatitude())),
                ((fromLocation.getLongitude())));

        LatLng to = new LatLng(((toLocation.getLatitude())),
                ((toLocation.getLongitude())));

        polyline = mMap.addPolyline(new PolylineOptions()
                .add(from, to)
                .width(10).color(Color.parseColor("#801B60FE")).geodesic(true));

    } else if (locationList.size() > 2 && polyline.getPoints()!=null) {
        Location toLocation = locationList.get(locationList.size() - 1);
        LatLng to = new LatLng(((toLocation.getLatitude())),
                ((toLocation.getLongitude())));

           points = polyline.getPoints();
            points.add(to);
            polyline.setPoints(points);

    }

一段时间后它会导致OOM:

致命异常:java.lang.OutOfMemoryError 无法分配 603979784 字节分配,其中 16777216 个可用字节和 197MB 直到 OOM

java.util.Arrays.copyOf(Arrays.java:3352)

java.lang.AbstractStringBuilder.expandCapacity (AbstractStringBuilder.java:130) com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:87)

谁能给我一个解决方案??

【问题讨论】:

  • 保留上一条折线的句柄并在绘制新折线之前将其删除。
  • @MartinZeitler,实际上是一条折线,但每 5 秒它变得更大,我需要整条折线

标签: android google-maps polyline


【解决方案1】:

我认为您正在尝试分配一个数组,该数组在这一行中包含多个 Integer.MAX_VALUE 元素。您不能分配超过 Integer.MAX_VALUE。

ArrayList<Location> locationList = Service.locationList;

检查Service.locationList的大小

【讨论】:

  • locationList 是一个 ArrayList,它没有 MAX_VALUE,我使用它每 5 秒存储一次来自服务的位置。
  • 你能调试一下这个数组的大小吗?您的数组大小超过了不应发生的 Integer.MAX_VALUE。 ArrayList 可使用索引整数值访问,整数值的限制为 Integer.MAX_VALUE。
  • 这将是 2^31-1 等于 2147483647... 乘以 5s
  • 哦,我想这是我的问题,它在数组列表中存储了超过 2147483647 个位置,你认为这个问题的最佳解决方案是什么?例如制作另一个数组?
【解决方案2】:

使用PolyUtil方法.simplyfy()更保守地处理内存利用率。

这是repositorydocumentation

【讨论】:

  • 谢谢,我会试试这个解决方案。
  • 你可以extend Polyline 并添加一个方法来添加一个verticle - 因为.getPoints() 返回当前点的快照,这会使内存利用率加倍。可惜Polyline默认没有这样的方法。
【解决方案3】:

创建LatLng列表的全局变量, ArrayList alData =new ArrayList();

在您的广播接收器上添加以下代码,

LatLng position = new LatLng(((ocation.getLatitude())),
                ((location.getLongitude())));
        alData.add(position);

        if (polyline!=null)polyline.remove();

        polyline = googleMap.addPolyline(new PolylineOptions().addAll(alData));

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 2011-09-09
    • 1970-01-01
    • 2013-07-25
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多