Ciao Marco,
innanzitutto grazie per la risposta. Evidentemente devo aver commesso diversi errori... provo ad affrontare i vari punti che mi hai proposto:
In ogni caso penso che il problema sia un accesso simultaneo alla variabile Vector, che non puoi fare. Usa un ArrayList.
L'uso di due Vector (Amici e newAmici) è proprio per evitare conflitti tra le operazioni svolte da Update() e da aggiornaSchermata().
Inutile mettere synchronized in quei due metodi. Li usi per assegnare la variabile, ma non per la lettura. Quindi hai accesso simultaneo.
sincronizza() modifica l'area puntata da Amici, mentre aggiornaSchermata() ne legge il contenuto.
Sai che con il comando Amici=newAmici; non stai ricreando il vettore ma stai puntando sempre alla stessa variabile? Quindi pensi che lavori con una mentre aggiorni l'altra nel ciclo Update, ma non è cosi!
In generale: lavora con un solo vettore (meglio un ArrayList) ed usa quello per tutto senza scambi di variabili. La funzione sincronizza la vedo inutile, dall'handler chiama direttamente aggiornaSchermata facendo il ciclo sull'ArrayList.
newAmici viene restituito ogni volta da un metodo che crea un nuovo Vector e lo popola: l'area di memoria è quindi diversa di volta in volta. Creo i newAmici e con Amici=newAmici punto al nuovo Vector, in modo da aggiornare la schermata con i nuovi dati. Sbaglio?
La sincronizzazione è per evitare che aggiornaSchermata() si trovi a lavorare su Amici mentre sincronizza() modifica l'area di memoria da esso puntata.
In ogni caso, per come la vedo io ha sbagliato l'approccio.
Da quello che vedo, il vector è una variabile di model, mentre tu la usi come una variabile di view. Nel vettore non salvare l'ImageView ma il dato puro (probabilmente l'indirizzo dell'immagine). L'ImageView la crei una volta e la vai aggiornando nel metodo aggiornaSchermata impostando semplicemente la url che prendi dal vettore (inoltre, se la url non è cambiata, non l'aggiorni affatto, aumentando le prestazioni dell'applicazione).
Il Vector contiene degli oggetti della classe Amico: ogni amico, oltre ai soliti dati (nome, cognome, etc...), possiede anche la sua ImageView, che in questo modo non deve essere ricostruita ad ogni aggiornamento di schermata. (Update viene eseguito ogni tot secondi, aggiornaSchermata viene eseguito con frequenza molto più alta).
Grazie ancora per l'attenzione... e scusa l'inesperienza!
