使用迭代器时的java.util.ConcurrentModificationException
我有下面的代码来形成一个url,但是一些客户端在for循环中报告了异常。 java.util.ConcurrentModificationException 在java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)使用迭代器时的java.util.ConcurrentModificationException,java,android,Java,Android,我有下面的代码来形成一个url,但是一些客户端在for循环中报告了异常。 java.util.ConcurrentModificationException 在java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) List requestParams=adRequest .createRequestParamsList(view.getContext()); RequestTask currentTask=新的Request
List requestParams=adRequest
.createRequestParamsList(view.getContext());
RequestTask currentTask=新的RequestTask(此,
view.getUserAgent(),view.getContext(),keyCode);
试一试{
currentTask.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,
baseRequestUrl+Request.REQ_URI,requestParams);
}捕获(例外e){
}
字符串debugUrl=“”;
已同步(此){
debugUrl=baseRequestUrl+Request.REQ_URI+“?”;
for(Iterator Iterator=requestParams.Iterator();Iterator.hasNext();){
NameValuePair nvp=iterator.next();
debugUrl=debugUrl+nvp.getName()+“=”+nvp.getValue()+“&”;
}
debugUrl=debugUrl.substring(0,debugUrl.length()-1);
}
requestParam在RequestTask中修改。为什么会失败?在有序集上使用
迭代器时,必须使用迭代器。删除()
而不是在您的注释之后,我怀疑您应该在requestParams
对象上同步,而不是在this
上同步
异步任务没有对正在迭代的对象的引用,因此它们没有锁定同一个对象,这实际上与根本不同步是一样的
确保两个类在同一对象的同一引用上同步
PS:如果两个类都进行了同步(这一点),那么它们实际上是在不同的对象实例上进行同步。DoWatch。避免迭代器我有点困惑,因为您没有在迭代器块内修改requestParams对象。您是否在其他线程中修改requestParams
,在本例中称为RequestTask的异步任务中,如果在使用迭代器对数组列表进行迭代时修改了数组列表
,则会得到并发修改异常
。
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);
}