내 응용 프로그램은 Android 1.6에서 제대로 작동하지만 Android 2.2에서 실행할 때 일부 장소에서는 concurrentModificationException이 발생합니다. 며칠 동안 내 머리를 감싼 후에 이론을 제안했습니다. 1.6 이후 멀티 스레딩 (또는 비슷한)이 도입 된 것 같습니다. 이게 그럴 수 있니? 그렇다면 멀티 스레딩없이 응용 프로그램을 강제로 실행할 수있는 방법이 있습니까? 나는 목표를 1.6으로 설정하려했지만 운이 없다 .. 미리, 시간 내 주셔서 감사드립니다.1.6에서 2.2로 안드로이드를 업그레이드 할 때 예외가 발생합니다.
예외 : handleresult 코드와
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): FATAL EXCEPTION: main
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { cmp=ntnu.client/com.google.android.maps.MapView (has extras) }} to activity {ntnu.client/ntnu.client.MapClient}: java.util.ConcurrentModificationException
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread.deliverResults(ActivityThread.java:3808)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3850)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread.access$2800(ActivityThread.java:136)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2209)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.os.Handler.dispatchMessage(Handler.java:99)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.os.Looper.loop(Looper.java:143)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread.main(ActivityThread.java:5068)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at java.lang.reflect.Method.invokeNative(Native Method)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at java.lang.reflect.Method.invoke(Method.java:521)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at dalvik.system.NativeStart.main(Native Method)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): Caused by: java.util.ConcurrentModificationException
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at ntnu.client.MapClient.handleResult(MapClient.java:599)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at ntnu.client.MapClient.onActivityResult(MapClient.java:881)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.Activity.dispatchActivityResult(Activity.java:3988)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): at android.app.ActivityThread.deliverResults(ActivityThread.java:3804)
04-05 11:47:12.812: ERROR/AndroidRuntime(5328): ... 11 more
코드는 아래와 같습니다.
public synchronized void handleResult(boolean notify)
{
if(!citynodes.equals(null) && citynodes.size()>0)
{
noteBaloon.setVisibility(0x00000008);
Drawable drawable = this.getResources().getDrawable(R.drawable.up);
Context myContext = this;
itemizedoverlay = new CitynodeItemizedOverlay(drawable,myContext);
itemizedoverlay.setThumbsUp(BitmapFactory.decodeResource(
getResources(), R.drawable.vote_yes3));
itemizedoverlay.setThubmsDown(BitmapFactory.decodeResource(
getResources(), R.drawable.vote_no3));
itemizedoverlay.addObserver(this);
//itemizedoverlay.setDoAnimtation(true);
RecommendationNotificationOverlay overlay = new RecommendationNotificationOverlay();
for (Recommendation n : citynodes)
{
CitynodeOverlayItem cn= n.getNode().getOverlayItem();
Drawable marker = this.iconmanager.changeBackground(this.iconmanager.findIcon(n.getNode()),Integer.parseInt(n.getSystemRating()),n.isPersonalized());
//marker.setAlpha(100);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
ShapeDrawable l;
cn.setMarker(marker);
cn.setNode(n);
itemizedoverlay.addOverlay(cn);
LayoutInflater inflater = getLayoutInflater();
}
for(Overlay i : getMapView().getOverlays())
{
if((i instanceof ItemizedOverlay)) //|| (i instanceof RecommendationNotificationOverlay))
this.mapView.getOverlays().remove(i);
}
for(Overlay i : getMapView().getOverlays())
{
if((i instanceof RecommendationNotificationOverlay))
this.mapView.getOverlays().remove(i);
}
List <Recommendation> proactive = new ArrayList<Recommendation>();
for(Recommendation potpro : this.citynodes)
{
if(potpro.isProactive())
{
proactive.add(potpro);
}
}
overlay.setNotifications(proactive);
mapOverlays.add(overlay);
mapOverlays.add(itemizedoverlay);
mapView.invalidate();
}
}
이 예외가 참조 부호는 제이기 루프 :
for(Overlay i : getMapView().getOverlays())
코드는 또한 (다른 액션 처리)이 라인에서 같은 예외 예외 :
if(!citynodes.equals(null) && citynodes.size()>0)
이 오류의 로그를 제공 할 수 있습니까? 1.6에서 2.2로 업그레이드하는 것이 문제가되지 않아야합니다. –
오류가 thread.Did 때문이 아닙니다. 프로그램에서 오류가 발생 했습니까? –
안드로이드는 항상 멀티 스레딩을 가지고 있었지만, 2.2에서는 JIT를 도입하여 속도가 약간 향상되었으며, 스레드가 이전에 행운을 가져다 줄 정도로 타이밍을 변경했을 수 있습니다. – Nick