致命异常:java.lang.OutOfMemoryError将折线添加到Google地图时

时间:2018-11-27 11:40:46

标签: android google-maps polyline

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

    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       在OOM之前无法分配具有16777216个空闲字节和197MB的603979784字节分配

     

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

     

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

任何人都可以给我解决方案吗?

3 个答案:

答案 0 :(得分:0)

我认为您正在尝试分配此行中具有多个Integer.MAX_VALUE元素的数组。您分配的资源不能超过Integer.MAX_VALUE。

ArrayList<Location> locationList = Service.locationList;

检查Service.locationList的大小

答案 1 :(得分:0)

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

这是repositorydocumentation

答案 2 :(得分:0)

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