Требуется ли синхронизация в AsyncTask
Требуется ли синхронизация в AsyncTask
Не могу понять требуется ли синхронизация. Кто сталкивался с такими задачами? помогите
В потоке 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]
Последний раз редактировалось elinux 02 июл 2013, 14:36, всего редактировалось 2 раза.
Re: Требуется ли синхронизация в AsyncTask
Требуется написать listener свой
CEO of a company R.id.team
Re: Требуется ли синхронизация в AsyncTask
Sorry, а каким образом listener поможет?Finch писал(а):Требуется написать listener свой
Я думал надо делать Java-монитор для синхронизации функций взаимодействующих со списком.
Я не прав? Может есть еще какие-либо решения?
Re: Требуется ли синхронизация в AsyncTask
Если многопоточность то да нужна синхронизация. И у тебя тут скорее проблема архитектурная, если ты знаешь где у тебя может вылезти Exception значит код написан не правильно
CEO of a company R.id.team
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Требуется ли синхронизация в AsyncTask
Судя по документации,
И собственно закономерный вопрос, а что вообще делается в doInBackground ??? Я что-то там вижу пустоту... Для чего вообще тут используется AsyncTask ?
перебор будет выполняться в том же UI потоке, а это значит, что перебор и другая работа выполняется в одном потоке. И синхронизация тут не нужна.onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...).
И собственно закономерный вопрос, а что вообще делается в doInBackground ??? Я что-то там вижу пустоту... Для чего вообще тут используется AsyncTask ?
Re: Требуется ли синхронизация в AsyncTask
Я тоже не могу совсем понять зачем тут асинктаск, эту архитектуру мне не понять
CEO of a company R.id.team
Re: Требуется ли синхронизация в AsyncTask
Архитектура у меня такая:Finch писал(а):Я тоже не могу совсем понять зачем тут асинктаск, эту архитектуру мне не понять
1. основной UI-поток запускает AsyncTask
1.1 AsyncTask периодически просыпается и в методе onProgressUpdate (UI-поток) перебирает свой список объектов и передает им время (объекты его тупо показывают)
2. пользователь нажимает кнопку и добавляет новый объект в список AsyncTask'а методом addMyObjectToList
3. при закрытии программы список AsyncTask'а очищается методом setMyObjectList(null)
Вот у меня и возникли сомнения, что пункты 2 и 3 могут вызвать ошибку когда работает пункт 1.1
Извиняюсь за глупые вопросы, перехожу с С на Java вот и мерещятся подвохи.
На С я бы мютексами ограничил эти куски кода, поскольку перебор списка может быть прерван в любой момент! а процессор будет передан для работы другому потоку, а этот другой поток возьмет и очистит список AsynckTask'а
Развейте мои сомнения. Спасибо
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Требуется ли синхронизация в AsyncTask
Прошу перечитать моё сообщение еще раз. У вас всё делается в одном и том же потоке, поэтому я не понимаю что вас тут смущает, тут хоть в С, хоть в Java, хоть где, в одном потоке не будет проблем с синхронизацией. Поток один!
Re: Требуется ли синхронизация в AsyncTask
Я слабоумный, но когда так делаем(основной UI-поток запускает AsyncTask) при смене оринтейшна, не закрывается текущий активити?elinux писал(а): Архитектура у меня такая:
1. основной UI-поток запускает AsyncTask
Если бы С мог разговаривать он бы наверно сказал, неее он(elinux) не нашИзвиняюсь за глупые вопросы, перехожу с С на Java вот и мерещятся подвохи.
«Life is too short to spend rewriting code»