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,或重新構建代碼以更新正在使用的主線程上的散列映射。

相關問題