4

fellasjava.util.ConcurrentModificationException在MapView上

我从很多天都面临很奇怪的问题。我正在尝试更新覆盖图。因此,当我在地图上触摸或有时在地图试图更新覆盖图时遇到“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) 

我使用Balloon Overlay

我认为这是对"mapview.getOverlay()"抛出错误,因为它是在数秒内调用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) 
      { 

      } 
     } 
    }; 

这是我的updateMethod(); 在此代码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); 

} 

这里是我的addOverlayMethod

addOverlayMethod(Activity mActivity, final MapView mapView, final Object mObject) 
{ 
    mActivity.runOnUiThread(new Runnable(){ 

     @Override 
     public void run() 
     { 

       try { 
        MyItemizedOverlay overlay = (MyItemizedOverlay) mObject; 
        mapView.getOverlays().add(overlay); 
       } catch (Exception e) 
       {}    

     } 
    }); 
} 
+0

我可以看到你正在试图修改/更新你的覆盖执行? – 2012-02-17 10:02:58

+0

有很多类和覆盖包,所以我不能在这里显示所有..谢谢兄弟 – 2012-02-17 10:07:13

+0

确保您尝试刷新或从'UI线程'本身刷新或更新您的覆盖,而不是'非UI线程'。 – 2012-02-17 10:08:33

回答

2

雅,你可以做一个工作, 步骤如下。

  1. 设置Pendingnotification类(修饰细节)。
  2. 列出Pendingnotification。
  3. 当任何通知收到dnt直接修改它,收集所有的修改,并把堆栈(Pendingnotification类)即。将其添加到Pendingnotification列表中。
  4. 现在逐个修改对象并在其工作完成时删除同一对象。

同样的方式,直到Pendingnotification List变为空。

而且还指出,任何修改必须在UI ThreadNonUI Thread

1

我想你使用Thread及其创建Concurrency运行中的方法,以便使用Syncronized(MainActivity.this) ...... 。使用矢量代替列表因为矢量是同步的...它对我来说是...

+0

有很多覆盖,所有从服务类更新我也放在runOnUiThread .. – 2012-02-17 10:00:05

+0

@CapDroid我有同样的问题,它发生了一些时间,所以我做研发和得到这个最终的解决方案.... – 2012-02-17 10:01:16

+0

好吧让我检查 – 2012-02-17 10:03:19

2

In为了避免ConcurrentModificationException简单地复制您的收藏在以下任何一种情况:

  • 遍历集合
  • 之前传递到API

乍一看之前,这似乎是大材小用但稍后会为您节省很多头痛。复印很简单,只需拨打new ArrayList<YourClass>(existingList)即可。

+0

hi @Matt我也做了它,但我不知道它会100%解决我的问题吗? – 2012-02-17 10:32:22

+0

如果你不再有任何'ConcurrentModifictionException',那么,是的:) – Matt 2012-02-17 10:33:52

+0

我已经做到了,但仍然出现错误:( – 2012-02-17 10:37:13

1

嗯,看来你updateMethod()你还在试图Update您的UI从Non-UI线程通过

mapview.getOverlays().remove(hashmapOnlineFriendsOverlay.get(id)); 

所以,尽量执行代码的这部分RunOnUiThread内和尝试。希望这会起作用。

UPDATE: 

另外,为什么您要addremoveOverlay的一切,你不需要做只是尝试更新您的Overlayinvalidate它。 Have a look at this example.

+0

我也试过,当我把它,然后我的应用程序是挂..bcz该方法在时间多次调用 – 2012-02-20 06:13:22

+0

还有一件事情,当我触摸地图或任何覆盖,否则它正在工作正常,这个错误即将到来 – 2012-02-20 06:14:15

+0

你好@Lalit Poptani我把RunOnUiThread只用于删除行,但仍然出现错误..已经看到这个例子,但我也想弹出当用户触摸覆盖,所以.......等 – 2012-02-20 06:35:57

1

我不确定覆盖层管理,但我看到它的方式,你正在用HashMap修改你的HashMap。放在非UI线程(在UpdateMethod中),当它无疑被迭代或在应用程序中的其他地方使用时 - 可能在您移动地图时仍请求新的叠加层。

如果您阅读docs,则表示这将导致ConcurrentModificationException。相反,请尝试使用ConcurrentHashMap,或重新构建代码以更新正在使用的主线程上的散列映射。

相关问题