Witam
Piszę program (na androida), który ma mieć następującą budowę: w serwisie działającym w tle zadeklarowałem tablicę
List<myDevice> devices = new ArrayList<myDevice>();
Elementy tej tablicy są dodawane, usuwane i modyfikowane z poziomu serwisu. Serwis działa w tle.
W aplikacji jest też Activity, które odpowiedzialne jest za wyświetlanie informacji o elementach tablicy, kod mniej więcej taki:
...
String nazwy[] = new String[myService.devices.size()];
for(int i = 0 ; i < myService.devices.size() ; i++)
{
nazwy[i] = myService.devices.get(i).name;
}
Zdarza mi się, że w czasie przepisywania nazw serwis zmodyfikuje tablicę DEVICES metodą np. devices.remove(1);
. Aplikacja się wysypuje, ponieważ w pętli próbuje dostać się do elementu tablicy, który nie istnieje - błąd
java.lang.ArrayIndexOutOfBoundExeption
Poszukałem trochę po necie i znalazłem rozwiązanie, które działa - czyli zastosowałem synchronized(). W serwisie kiedy coś dodaję lub usuwam wywołuję metodę
synchronized(devices)
{
devices.remove(0);
};
a w aktywności
...
synchronized(myService.devices)
{
String nazwy[] = new String[myService.devices.size()];
for(int i = 0 ; i < myService.devices.size() ; i++)
{
nazwy[i] = myService.devices.get(i).name;
}
};
Moje pytanie jest takie: czy robię to dobrze? W serwisie wywołuję metodę remowe() tablicy, a w akywnosci - metodę get(). Czy ktoś może mi wytłumaczyć dlaczego to działa poprawnie (tzn. nie wysypuje aplikacji)?