Требуется ли синхронизация в AsyncTask

Ответить
elinux
Сообщения: 7
Зарегистрирован: 17 янв 2013, 10:35

Требуется ли синхронизация в AsyncTask

Сообщение elinux » 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]
Последний раз редактировалось elinux 02 июл 2013, 14:36, всего редактировалось 2 раза.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Требуется ли синхронизация в AsyncTask

Сообщение Finch » 02 июл 2013, 08:54

Требуется написать listener свой
CEO of a company R.id.team

elinux
Сообщения: 7
Зарегистрирован: 17 янв 2013, 10:35

Re: Требуется ли синхронизация в AsyncTask

Сообщение elinux » 02 июл 2013, 09:10

Finch писал(а):Требуется написать listener свой
Sorry, а каким образом listener поможет?
Я думал надо делать Java-монитор для синхронизации функций взаимодействующих со списком.
Я не прав? Может есть еще какие-либо решения?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Требуется ли синхронизация в AsyncTask

Сообщение Finch » 02 июл 2013, 09:25

Если многопоточность то да нужна синхронизация. И у тебя тут скорее проблема архитектурная, если ты знаешь где у тебя может вылезти Exception значит код написан не правильно ;)
CEO of a company R.id.team

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Требуется ли синхронизация в AsyncTask

Сообщение Mikhail_dev » 02 июл 2013, 11:43

Судя по документации,
onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...).
перебор будет выполняться в том же UI потоке, а это значит, что перебор и другая работа выполняется в одном потоке. И синхронизация тут не нужна.

И собственно закономерный вопрос, а что вообще делается в doInBackground ??? Я что-то там вижу пустоту... Для чего вообще тут используется AsyncTask ?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Требуется ли синхронизация в AsyncTask

Сообщение Finch » 02 июл 2013, 11:48

Я тоже не могу совсем понять зачем тут асинктаск, эту архитектуру мне не понять
CEO of a company R.id.team

elinux
Сообщения: 7
Зарегистрирован: 17 янв 2013, 10:35

Re: Требуется ли синхронизация в AsyncTask

Сообщение elinux » 02 июл 2013, 12:53

Finch писал(а):Я тоже не могу совсем понять зачем тут асинктаск, эту архитектуру мне не понять
Архитектура у меня такая:
1. основной UI-поток запускает AsyncTask
&nbsp;&nbsp;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

Сообщение Mikhail_dev » 02 июл 2013, 14:52

Прошу перечитать моё сообщение еще раз. У вас всё делается в одном и том же потоке, поэтому я не понимаю что вас тут смущает, тут хоть в С, хоть в Java, хоть где, в одном потоке не будет проблем с синхронизацией. Поток один!

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Требуется ли синхронизация в AsyncTask

Сообщение mdzht » 21 фев 2014, 08:31

elinux писал(а): Архитектура у меня такая:
1. основной UI-поток запускает AsyncTask
Я слабоумный, но когда так делаем(основной UI-поток запускает AsyncTask) при смене оринтейшна, не закрывается текущий активити?

Извиняюсь за глупые вопросы, перехожу с С на Java вот и мерещятся подвохи.
Если бы С мог разговаривать он бы наверно сказал, неее он(elinux) не наш
«Life is too short to spend rewriting code»

Ответить