即使使用迭代器,添加到我的arraylist也会导致ConcurrentModificationException

时间:2015-04-12 11:48:21

标签: java android google-maps arraylist

在为每个循环添加正常工作之前,但是删除不是这样我使用了迭代器。现在我添加到arrayList的每个第3项都给了ConcurrentModificationException。什么似乎是问题?

private ArrayList<Marker> mMarkers

中实例化的

onCreate

我在onCreateView

上有一个列表视图
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            final Events event = mEventsParseQueryAdapter.getItem(position);

            GoogleMap googleMap = mSupportMapFragment.getMap();

            if (mMarkers.isEmpty()) {
                mMarkers.add(googleMap.addMarker(new MarkerOptions()
                        .position(getLatLngFromGeoPoint(event.getLocation()))));
            } else {
                Iterator<Marker> markerIterator = mMarkers.iterator();

                //noinspection WhileLoopReplaceableByForEach
                while (markerIterator.hasNext()) {
                    Marker marker = markerIterator.next();
                    if (marker.getPosition().equals(getLatLngFromGeoPoint(event.getLocation()))) {
                        return false;
                    } else {
                        mMarkers.add(googleMap.addMarker(new MarkerOptions()
                                .position(getLatLngFromGeoPoint(event.getLocation()))));
                    }
                }
            }
            return true;
        }
    });

这是我在点击监听器上的标记,它会弹出一个对话框,并有一个删除标记的选项

googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(final Marker marker) {

            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(marker.getPosition(), CONSTANT.ZOOM_LEVEL));

            AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());
            dialog.setNegativeButton(R.string.checkout, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    mMarkers.remove(marker);
                    marker.remove();
                }
            }).setPositiveButton(R.string.frames, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            dialog.create().show();

            return true;
        }
    });

3 个答案:

答案 0 :(得分:2)

无论是使用for-each还是迭代器,都无法在迭代时修改列表。阅读例外页面上的更多内容:http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

答案 1 :(得分:1)

mMarkers.add(googleMap.addMarker(new MarkerOptions()
在迭代循环(while (markerIterator.hasNext()))内部调用

,因此在遍历集合时添加元素会导致错误。

其实你可能想要:

           } else {
                mMarkers.add(googleMap.addMarker(new MarkerOptions()
                        .position(getLatLngFromGeoPoint(event.getLocation()))));
            }

分支不在循环内部,但在整个while循环之外rahter(当没有找到现有标记时,创建并添加新标记。

答案 2 :(得分:0)

您正在使用故障快速迭代器(casE中的markerIterator)同时解析/添加或读取/写入列表。如果迭代器将在代码中检测到这种行为,它将抛出此异常。

  

一个线程通常不允许修改Collection而另一个线程迭代它

因此,您的读/写操作应该取消关联,时间老虎。