从ArrayList中删除标记:java.util.ConcurrentModificationException

时间:2015-07-16 16:56:22

标签: java android

我有一个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);

            }

        }
}

1 个答案:

答案 0 :(得分:1)

该异常是由mapItemList.add(mapItem);引起的。当您对其进行迭代时,对集合的每次修改都将导致此异常。来自documentation

  

例如,如果一个线程直接修改了一个集合   使用失败快速迭代器迭代器迭代集合   将抛出此异常。

要解决此问题,您可以使用ListIterator代替Iterator(使用listIterator()检索它),并使用iterator.add(mapItem);或者您可以使用临时{ {1}}您将在循环时添加您创建的项目,并在循环结束后使用ArrayList将整个内容添加到addAll