当前位置: 代码迷 >> java >> 从ArrayList中删除标记:java.util.ConcurrentModificationException
  详细解决方案

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

热度:53   发布时间:2023-07-27 09:27:47.0

我有一个复选框列表,用户可以在其中选择一些路由,然后从服务器获取响应。 我有方法gotoLocation来更新标记的位置,以及在将新标记插入到具有相同路由的服务器端表中时在地图中添加新标记。

我之前使用HashMap<Integer, Marker> as <id, marker>进行了尝试,但是在将新请求的新标记添加到地图时遇到了问题,所以我使用ArrayList<Integer, String>进行了尝试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);

            }

        }
}

异常是由mapItemList.add(mapItem);引起的mapItemList.add(mapItem); 在迭代集合时,对集合的每次修改都会导致此异常。

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

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

  相关解决方案