Требуется ли синхронизация в AsyncTask
Добавлено: 01 июл 2013, 13:42
Не могу понять требуется ли синхронизация. Кто сталкивался с такими задачами? помогите
В потоке AsyncTask методом onProgressUpdate перебираем список объектов и для каждого вызываем метод updateCounter. Список объектов может быть изменен в любой момент из вне методами setMyObjectList, addMyObjectToList и removeMyObjectFromList. Требуется ли синхронизировать эти методы с циклом перебора объектов? и как это лучше сделать?
[syntax=java]public class MyThread extends AsyncTask <Void, Long, Void>
{
private ArrayList<MyObject> sswList;
public MyThread() {
super();
sswList = new ArrayList<MyObject>();
}
@SuppressWarnings("unchecked")
public void setMyObjectList (ArrayList<MyObject> sswList) {
if(sswList != null)
this.sswList = (ArrayList<MyObject>) sswList.clone();
else this.sswList.clear();
}
public void addMyObjectToList (MyObject ssw) {
sswList.add(ssw); /////////добавляет объект в список
}
public void removeMyObjectFromList (MyObject ssw) {
sswList.remove(ssw); //////////////очищает список
}
@Override
protected Void doInBackground (Void... params) {
try
{
do
{
TimeUnit.MILLISECONDS.sleep(500);
publishProgress(TimeFunction.getTime());
}while (!isCancelled());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate (Long... msTime) {
super.onProgressUpdate(msTime);
if((sswList != null)&&(!isCancelled()))
for(MyObject ssw:sswList) ////////////////////////////перебирает список и его изменение может вызвать СБОЙ??
ssw.updateCounter(msTime[0]);
}
}//end class MyThread[/syntax]
В потоке AsyncTask методом onProgressUpdate перебираем список объектов и для каждого вызываем метод updateCounter. Список объектов может быть изменен в любой момент из вне методами setMyObjectList, addMyObjectToList и removeMyObjectFromList. Требуется ли синхронизировать эти методы с циклом перебора объектов? и как это лучше сделать?
[syntax=java]public class MyThread extends AsyncTask <Void, Long, Void>
{
private ArrayList<MyObject> sswList;
public MyThread() {
super();
sswList = new ArrayList<MyObject>();
}
@SuppressWarnings("unchecked")
public void setMyObjectList (ArrayList<MyObject> sswList) {
if(sswList != null)
this.sswList = (ArrayList<MyObject>) sswList.clone();
else this.sswList.clear();
}
public void addMyObjectToList (MyObject ssw) {
sswList.add(ssw); /////////добавляет объект в список
}
public void removeMyObjectFromList (MyObject ssw) {
sswList.remove(ssw); //////////////очищает список
}
@Override
protected Void doInBackground (Void... params) {
try
{
do
{
TimeUnit.MILLISECONDS.sleep(500);
publishProgress(TimeFunction.getTime());
}while (!isCancelled());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate (Long... msTime) {
super.onProgressUpdate(msTime);
if((sswList != null)&&(!isCancelled()))
for(MyObject ssw:sswList) ////////////////////////////перебирает список и его изменение может вызвать СБОЙ??
ssw.updateCounter(msTime[0]);
}
}//end class MyThread[/syntax]