2015-08-06 4 views
0

У меня есть следующий код для формирования URL-адреса, но некоторые клиенты сообщили об исключении в цикле for. java.util.ConcurrentModificationException в java.util.ArrayList $ ArrayListIterator.next (ArrayList.java:573)java.util.ConcurrentModificationException при использовании итератора

List<NameValuePair> requestParams = adRequest 
      .createRequestParamsList(view.getContext()); 

    RequestTask currentTask = new RequestTask(this, 
      view.getUserAgent(), view.getContext(), keyCode); 

    try { 
      currentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
       baseRequestUrl + Request.REQ_URI, requestParams); 

    } catch (Exception e) { 

    } 

       String debugUrl = ""; 
       synchronized (this) { 
        debugUrl = baseRequestUrl + Request.REQ_URI + "?"; 
        for (Iterator<NameValuePair> iterator = requestParams.iterator(); iterator.hasNext();) { 
         NameValuePair nvp = iterator.next(); 
         debugUrl = debugUrl + nvp.getName() + "=" + nvp.getValue() + "&"; 
        } 
        debugUrl = debugUrl.substring(0, debugUrl.length() - 1); 
       } 

requestParam изменяется в RequestTask. почему это провалится?

+0

Просмотрите https://www.youtube.com/watch?v=MZOf3pOAM6A. Избегайте итераторов – Raghunandan

+0

Im немного запутался, так как вы arent изменяете объект requestParams внутри блока итератора. –

+0

Вы изменяете 'requestParams' в другом потоке? –

ответ

0

При использовании Iterator по заказу вы должны использовать iterator.remove() вместо <? extends Collection>.remove(). Последний дает ConcurrentModificationException. Если вы изменяете requestParams в другом потоке, и вы должны использовать Iterator либо иметь поле private Iterator iter в своем классе и предоставить метод getIterator() и выполнить нулевые проверки.

2

После ваших комментариев, я подозреваю, что вы должны синхронизировать объект requestParams, а не на this.

Задача async не имеет ссылки на объект, который выполняет итерацию, поэтому они не блокируются на одном и том же объекте, что практически не совпадает с синхронизацией.

Убедитесь, что оба класса синхронизируются по одной и той же ссылке того же объекта!

PS: Если оба класса выполняют синхронизацию (это), они эффективно синхронизируются с различными экземплярами объектов.

Смежные вопросы