Android MapView上的java.util.ConcurrentModificationException
伙计们 很多天以来,我都面临着一个非常奇怪的问题。我正在尝试频繁更新覆盖。所以,有时当我触摸地图时,我会得到“java.util.ConcurrentModificationException”,有时当地图试图更新覆盖时,我会得到“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
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: