Я продолжаю получать исключение параллельной модификации в моем коде. Я просто повторяю через hashmap и изменяя значения. Исследуя это, я обнаружил, что люди говорили использовать итераторы и iterator.remove и т. Д. Я попытался реализовать с этим и все еще продолжал получать ошибку. Я думал, может быть, несколько потоков обратились к нему? (Хотя в моем коде этот блок запускается только в одном потоке). Поэтому я помещаю его в синхронизированный блок. Тем не менее, я все еще получаю ошибку .....Android: Hashmap concurrent Исключение модификации
Map map= Collections.synchronizedMap(questionNumberAnswerCache);
synchronized (map) {
for (Iterator<Map.Entry<String, Integer>> it = questionNumberAnswerCache.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Integer> entry = it.next();
if (entry.getKey() == null || entry.getValue() == null) {
continue;
} else {
try {
Question me = Question.getQuery().get(entry.getKey());
int i = Activity.getQuery()
.whereGreaterThan(Constants.kQollegeActivityCreatedAtKey, lastUpdated.get("AnswerNumberCache " + entry.getKey()))
.whereEqualTo(Constants.kQollegeActivityTypeKey, Constants.kQollegeActivityTypeAnswer)
.whereEqualTo(Constants.kQollegeActivityQuestionKey, me)
.find().size();
lastUpdated.put("AnswerNumberCache " + entry.getKey(), Calendar.getInstance().getTime());
int old_num = entry.getValue();
entry.setValue(i + old_num);
} catch (ParseException e) {
entry.setValue(0);
}
}
}
}
Ошибка:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787)
at java.util.HashMap$EntryIterator.next(HashMap.java:824)
at java.util.HashMap$EntryIterator.next(HashMap.java:822)
at com.juryroom.qollege_android_v1.QollegeCache.refreshQuestionAnswerNumberCache(QollegeCache.java:379)
at com.juryroom.qollege_android_v1.QollegeCache.refreshQuestionCaches(QollegeCache.java:267)
at com.juryroom.qollege_android_v1.UpdateCacheService.onHandleIntent(UpdateCacheService.java:28)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
Вам не разрешено изменять коллекцию, пока вы перебираете ее. –
@PhilippSander Затем как можно изменить все значения в коллекции? Составьте список ключей, а затем, после того как я выйду из итерации, итерации моих ключей? – Pseduosance
Попробуйте использовать ConcurrentHashMap – yelliver