我有一个可在移动时跟踪位置的应用程序,每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)
任何人都可以给我解决方案吗?
答案 0 :(得分:0)
我认为您正在尝试分配此行中具有多个Integer.MAX_VALUE元素的数组。您分配的资源不能超过Integer.MAX_VALUE。
ArrayList<Location> locationList = Service.locationList;
检查Service.locationList的大小
答案 1 :(得分:0)
使用PolyUtil方法.simplyfy()
更保守地处理内存利用率。
答案 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));