Autore Topic: CuncurrentModificationException ma perché??  (Letto 690 volte)

Offline daveblack

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: 0
    • http://www.linkedin.com/profile/view?id=155824415&trk=tab_pro
    • Mostra profilo
    • DC Hall
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Mac OSX 10.7 Lion
CuncurrentModificationException ma perché??
« il: 07 Maggio 2012, 10:34:09 CEST »
0
Salve a tutti, da circa due giorni la mia applicazione throwa questa eccezione e non so dove o perché...

Immagino che sia per l'aggiunta di Overlay su una MapView usando thread concorrenti...

posto il logcat:
Codice: [Seleziona]
05-07 10:27:48.615: ERROR/AndroidRuntime(13842): FATAL EXCEPTION: main
05-07 10:27:48.615: ERROR/AndroidRuntime(13842): java.util.ConcurrentModificationException
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at com.google.android.maps.MapView.onDraw(MapView.java:494)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.View.draw(View.java:6740)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.View.draw(View.java:6743)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.View.draw(View.java:6743)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1902)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewRoot.draw(ViewRoot.java:1407)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.os.Looper.loop(Looper.java:123)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at android.app.ActivityThread.main(ActivityThread.java:4633)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at java.lang.reflect.Method.invoke(Method.java:521)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-07 10:27:48.615: ERROR/AndroidRuntime(13842):     at dalvik.system.NativeStart.main(Native Method)

se vi serve il codice dite pure che lo posto... grazie, se qualcuno sa qualcosa me lo dica perché son disperato...

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:CuncurrentModificationException ma perché??
« Risposta #1 il: 07 Maggio 2012, 10:45:08 CEST »
0
Direi che ci serve vedere il pezzo di codice dove c'è il ciclo che lancia l'eccezione.
A naso credo che stai provando a modificare la lista su cui stai iterando, qualcosa del tipo:

Codice (Java): [Seleziona]
Iterator iter = lista.iterator();
while(iter.hasNext()) {
 ...
  Object o = ...;
  lista.add(o); // ConcurrentModificationException: non posso modificare la lista su cui itero!
}

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:CuncurrentModificationException ma perché??
« Risposta #2 il: 08 Maggio 2012, 09:32:35 CEST »
0
A naso credo che stai provando a modificare la lista su cui stai iterando, qualcosa del tipo:


Non è corretto al 100%. I Vettori sono soggetti a sincronizzazione, vuol dire che se viene iterato, viene attivato un lock. Sulle Arraylist invece non è così. Comunque concordo che il problema dell'utente è come dici tu.

Saluti!

Offline daveblack

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: 0
    • http://www.linkedin.com/profile/view?id=155824415&trk=tab_pro
    • Mostra profilo
    • DC Hall
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Mac OSX 10.7 Lion
Re:CuncurrentModificationException ma perché??
« Risposta #3 il: 08 Maggio 2012, 22:52:36 CEST »
0
Ciao, non ho risposto per colpa della scuola...  >:(

comunque il problema era causato dal fatto che la MapView e quindi anche i suoi Overlays non possono essere modificati da un Non-UI Thread... quindi mi sono dovuto implementare una classe che estendesse Handler (O.T. grazie Apogeo per la bibbia) e ricevesse una lista per popolare la mappa...

posto la classe MapHandler che ho scritto (dato che è un problema molto comune ho visto):

Codice (Java): [Seleziona]
import java.util.concurrent.CopyOnWriteArrayList;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MapHandler extends Handler{
       
        private MapView mappa;
        private Context c;
        private Drawable pinMap;
       
        MapHandler(MapView mappa, Drawable pin, Context c){
                this.mappa = mappa;
                this.c = c;
                this.pinMap = pin;
        }
       
        @Override
        public void handleMessage(Message msg){
               
                POIFermate overlays = new POIFermate(pinMap,c);
               
                CopyOnWriteArrayList<Fermata> fermate = (CopyOnWriteArrayList<Fermata>) msg.obj;
               
                if(fermate.size()>0){
                        for(int i=0; i<fermate.size(); i++){
                                GeoPoint coord = new GeoPoint((int)(fermate.get(i).getLatitudine()*1000000), (int)(fermate.get(i).getLongitudine()*1000000));
                                OverlayItem FPin = new OverlayItem(coord, fermate.get(i).getNome(), "");
                                overlays.addOverlay(FPin);
                        }
                        mappa.getOverlays().clear();
                        Log.i("ST_INFO", "AGGIORNO");
                        mappa.getOverlays().add(overlays);
                    mappa.invalidate();
                }
        }

}

POIFermate è una classe che estende ItemizedOverlay e CopyOnWriteArrayList è una classe del package java.util.cuncurrent in cui è stata riscritta la classe ArrayList per renderla Thread-safe...
« Ultima modifica: 08 Maggio 2012, 22:56:09 CEST da daveblack »