Android MapView上的java.util.ConcurrentModificationException

Android MapView上的java.util.ConcurrentModificationException,android,android-mapview,java.util.concurrent,concurrentmodification,Android,Android Mapview,Java.util.concurrent,Concurrentmodification,伙计们 很多天以来,我都面临着一个非常奇怪的问题。我正在尝试频繁更新覆盖。所以,有时当我触摸地图时,我会得到“java.util.ConcurrentModificationException”,有时当地图试图更新覆盖时,我会得到“java.util.ConcurrentModificationException”,但我并没有找到这个错误即将出现的完美线条 02-17 14:56:01.621: W/dalvikvm(3653): threadid=1: thread exiting with

伙计们

很多天以来,我都面临着一个非常奇怪的问题。我正在尝试频繁更新覆盖。所以,有时当我触摸地图时,我会得到“java.util.ConcurrentModificationException”,有时当地图试图更新覆盖时,我会得到“java.util.ConcurrentModificationException”,但我并没有找到这个错误即将出现的完美线条

02-17 14:56:01.621: W/dalvikvm(3653): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-17 14:56:01.631: E/AndroidRuntime(3653): FATAL EXCEPTION: main
02-17 14:56:01.631: E/AndroidRuntime(3653): java.util.ConcurrentModificationException
02-17 14:56:01.631: E/AndroidRuntime(3653):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:576)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:41)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at com.google.android.maps.MapView.onDraw(MapView.java:530)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.View.draw(View.java:6880)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.View.draw(View.java:6883)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.View.draw(View.java:6883)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.View.draw(View.java:6883)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewRoot.draw(ViewRoot.java:1522)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.os.Looper.loop(Looper.java:130)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at android.app.ActivityThread.main(ActivityThread.java:3683)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at java.lang.reflect.Method.invokeNative(Native Method)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at java.lang.reflect.Method.invoke(Method.java:507)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-17 14:56:01.631: E/AndroidRuntime(3653):     at dalvik.system.NativeStart.main(Native Method)
我正在使用


我认为它在
“mapview.getOverlay()”
上抛出了错误,因为它在1秒内调用了4-5次

谢谢

CapDroid

下面是代码流。。 我的线程代码…

Thread connection = new Thread(){
        public void run() {
            try {

                while (my condition)
                {
                    try 
                    {
                                        //This method should be call every seconds
                        updateMethod();
                    } 
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                        break;
                    }
                } 
            } 
            catch (Exception e) 
            {

            }
        }
    };
这是我的更新方法() 在这段代码中,hashmapOverlay是如下所示的HashMap

 public static Map<String,MyItemizedOverlay> hashmapOverlay;

 public void updateMethod()
{

                    if(hashmapOverlay.containsKey(id))
                        {
                            mapview.getOverlays().remove(hashmapOnlineFriendsOverlay.get(id));
                        }
                    MyItemizedOverlay mMyItemizedOverlay = new MyItemizedOverlay(drawable, mapview);
                        OverlayItem overlayItem = new OverlayItem(gp,title ,snippet);
                        mMyItemizedOverlay.addOverlay(overlayItem); 
                    hashmapOverlay.put(id, mMyItemizedOverlay);
                    addOverlayMethod(mActivity, mapView, mMyItemizedOverlay);   

}

我认为您使用
线程
及其创建
并发
,因此使用
同步(MainActivity.this)
在您的Run方法中…使用Vector而不是List,因为Vector已同步…它对我有效…

为了避免
ConcurrentModificationException
在以下任何情况下只需复制您的集合:

  • 在迭代集合之前
  • 在将其传递到API之前

乍一看,这似乎有些过分,但它会让你在以后省去很多头痛。复制很简单,只需调用
newarraylist(existingList)

那么,在
updateMethod()
中,您似乎仍在尝试通过线程
非UI
更新您的UI

mapview.getOverlays().remove(hashmapOnlineFriendsOverlay.get(id));
因此,尝试在
RunOnUiThread
中执行这部分代码,然后重试。希望这能奏效

UPDATE:

另外,为什么您要尝试添加和删除
您的
覆盖
所有内容,您不需要这样做,只要尝试更新您的
覆盖
并使其无效即可

我不确定覆盖管理,但在我看来,你正在用HashMap修改你的HashMap.put(在UpdateMethod中)放在一个非UI线程上,而毫无疑问,它会在应用程序的其他地方被迭代或使用-可能是在你移动地图时仍然请求新覆盖的时候


如果您阅读,它会说这将导致ConcurrentModificationException。相反,请尝试使用,或重新构造代码以更新正在使用它的主线程上的hashmap。

是的,您可以解决这个问题, 步骤如下

  • 创建一个Pendingnotification类(修改详细信息)
  • 列出待处理通知的列表
  • 当任何通知收到dnt直接修改它时,收集所有修改并放入堆栈(Pendingnotification类),即将其添加到Pendingnotification列表中
  • 现在,一个接一个地修改对象,并在完成工作后删除相同的对象 同样的方法,直到Pendingnotification列表变为空


    还要注意的是,任何修改都必须在
    UI线程中执行,而不是在
    NonUI线程中执行。有许多覆盖,所有都是从服务类更新的,我也把它们放在runOnUiThread中。@CapDroid我也有同样的问题,有时也会发生,所以我会进行研发,并得到最终的解决方案……还有一件事,就是1次更新4-5次seconds@SamirVector已弃用
    @Samir您可以检查为什么我可以看到您试图修改/更新覆盖的位置?有许多类和覆盖包,所以我无法在此处全部显示。。谢谢兄弟,请确保您正在尝试从
    UI线程
    本身而不是从
    非UI线程
    @LalitPoptani你好,我用代码编辑了我的问题,您现在能帮我吗?嗨@Matt我也做了,但我不确定它是否能100%解决我的问题?如果您不再得到任何帮助
    ConcurrentModifierException
    ,嗯,是的:)我认为它在“mapview.getOverlay()”上抛出了错误,因为它在1秒内调用了4-5次。。是否可能?通常,如果您在迭代集合的同时集合发生更改,则会发生此错误。所以,理论上是的,但我不知道地图覆盖的具体实现细节。我认为最好的解决方案是,如果你能提供一个复制错误的示例项目,这样我们就可以调试它了@MattI也试过了当我把它放进去的时候我的申请就挂了。。bcz该方法多次调用另一个错误是当我触摸地图或任何覆盖图时出现的,否则它工作正常Hello@Lalit Poptani我将RunOnUiThread仅用于删除行,但仍然会出错..已经看到了该示例,但我还希望当用户触摸覆盖图时弹出,所以..等等
    UPDATE: