3

伙计们

很多天以来,我都面临着非常奇怪的问题。我正在尝试经常更新覆盖。因此,有时当我触摸地图时会收到“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);   

}

这是我的 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)
                {}              

        }
    });
}
4

5 回答 5

2

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

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

乍一看,这似乎有点矫枉过正,但它会在以后为您省去很多麻烦。复制很简单,只需调用new ArrayList<YourClass>(existingList).

于 2012-02-17T10:28:51.907 回答
1

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

如果您阅读文档,它会说这将导致 ConcurrentModificationException。相反,请尝试使用ConcurrentHashMap,或重组代码以更新正在使用它的主线程上的哈希图。

于 2012-02-25T05:23:15.007 回答
1

好吧,看来updateMethod()您仍在尝试从线程中访问UpdateUINon-UI

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

所以,试着在你的代码里面执行这部分代码RunOnUiThread并尝试。希望这会奏效。

UPDATE:

此外,为什么你要尝试addremove你的Overlay一切,你不需要这样做,只需尝试更新你的Overlayinvalidate它。Have a look at this example.

于 2012-02-20T06:10:14.353 回答
1

我认为你使用Thread和它的创建Concurrency所以Syncronized(MainActivity.this)在你的运行方法中使用......并使用矢量而不是列表,因为矢量是同步的......它对我有用......

于 2012-02-17T09:58:14.940 回答
1

是的,你可以做一个解决方法,步骤如下。

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

以同样的方式进行操作,直到 Pendingnotification List 变为空。

还要注意,任何修改都必须在UI Threadnot in 中执行NonUI Thread

于 2012-02-27T07:01:22.560 回答