我有一个checkboxlist,用户可以选择一些路由,然后从服务器获取响应。我有方法gotoLocation来更新标记的位置,以便在使用相同路径在服务器端插入新表时在地图中添加新标记。
我之前使用HashMap<Integer, Marker> as <id, marker>
尝试了但是我在向地图添加新请求的新标记时遇到了问题,因此我尝试使用ArrayList<Integer, String>
并且它可以正常运行,但我现在收到以下错误当我尝试从地图中删除标记时。
我该如何解决?
错误:
07-16 00:19:05.663: E/AndroidRuntime(29919): FATAL EXCEPTION: main
07-16 00:19:05.663: E/AndroidRuntime(29919): Process: com.bustracker, PID: 29919
07-16 00:19:05.663: E/AndroidRuntime(29919): java.util.ConcurrentModificationException
07-16 00:19:05.663: E/AndroidRuntime(29919): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
07-16 00:19:05.663: E/AndroidRuntime(29919): at com.bustracker.Map.gotoLocation(Map.java:132)
07-16 00:19:05.663: E/AndroidRuntime(29919): at com.bustracker.Map.onNewIntent(Map.java:314)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1224)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2833)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread.performNewIntents(ActivityThread.java:2846)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2855)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread.access$1700(ActivityThread.java:177)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1520)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.os.Handler.dispatchMessage(Handler.java:102)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.os.Looper.loop(Looper.java:145)
07-16 00:19:05.663: E/AndroidRuntime(29919): at android.app.ActivityThread.main(ActivityThread.java:5944)
07-16 00:19:05.663: E/AndroidRuntime(29919): at java.lang.reflect.Method.invoke(Native Method)
07-16 00:19:05.663: E/AndroidRuntime(29919): at java.lang.reflect.Method.invoke(Method.java:372)
07-16 00:19:05.663: E/AndroidRuntime(29919): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
07-16 00:19:05.663: E/AndroidRuntime(29919): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
代码:
private void gotoLocation(int id, double lat, double lng,
String route_direct) {
......
// Update the location.
for(Iterator<MapItem> it = mapItemList.iterator(); it.hasNext();){
//Line 132.
MapItem item1 = it.next();
if(item1.getId() == id){
marker = item1.getMarker();
marker.remove();
//int index = mapItemList.indexOf(item1);
it.remove();
ll = new LatLng(lat, lng);
MarkerOptions markerOpt = new MarkerOptions().title(
route_direct).position(ll);
marker = map.addMarker(markerOpt);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 11));
MapItem mapItem = new MapItem(id, marker);
mapItemList.add(mapItem);
}
}
}
答案 0 :(得分:1)
该异常是由mapItemList.add(mapItem);
引起的。当您对其进行迭代时,对集合的每次修改都将导致此异常。来自documentation
例如,如果一个线程直接修改了一个集合 使用失败快速迭代器迭代器迭代集合 将抛出此异常。
要解决此问题,您可以使用ListIterator
代替Iterator
(使用listIterator()
检索它),并使用iterator.add(mapItem);
或者您可以使用临时{ {1}}您将在循环时添加您创建的项目,并在循环结束后使用ArrayList
将整个内容添加到addAll