当我添加最后的第7项位置时,我遇到了问题,其他6项与自动删除whenhasEnded完美地工作。我不能添加第7项,当我得到其他项目(如1-6和添加第7项)时,我的应用程序出现了错误:
java.util.ConcurrentModificationException一是密码:
public List<LiveTvProgram> getLiveTvBookmarks() {
String name = context.getString(R.string.preferences_bookmarks_live_tv);
Set<String> bookmarks = preferenceHelper.getStringSet(name, name);
ArrayList<LiveTvProgram> bookmarkList = new ArrayList<>();
for (String title : bookmarks) {
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
if (program.getTitle().equals(title)) {
if (program.hasEnded()) {
bookmarks.remove(title);
} else {
bookmarkList.add(program);
}
break;
}
}
}
return bookmarkList;
}具有第一个for循环
for (String title : bookmarks) {
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
if (program.getTitle().equals(title)) {
if (program.hasEnded()) {
bookmarks.remove(title);
} else {
bookmarkList.add(program);
}
break;
}
}
}发布于 2016-08-22 08:01:36
您得到这个异常是因为您在通过调用bookmarks迭代列表bookmarks.remove(title)时试图修改它。请看一下这个问题的答案,看看如何避免这个问题:How to avoid java.util.ConcurrentModificationException when iterating through an removing elements from an ArrayList
附带说明:您确定确实需要从bookmarks列表中删除项目吗?在方法中通过调用
Set<String> bookmarks = preferenceHelper.getStringSet(name, name);而且,由于您在迭代之后不会对这个列表做任何事情,所以您可以直接删除。
更新:--重写循环的快速通用建议:
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
//Check if this program is in your bookmarks. As bookmarks is
//a Set, contains should be quite efficient
if (bookmarks.contains(program.getTitle()) {
bookmarkList.add(program);
//further improvement: you could check here if all bookmarks
//have been matched and exit the loop if yes
}
}如果确实需要清理bookmarks列表,则需要保留在此循环之后未包含在bookmarkList中的所有条目。
发布于 2016-08-22 07:51:38
不能在列表上迭代并修改它,它总是会导致ConcurrentModificationException。
因此,您的代码是不正确的,您不能在书签上迭代并删除循环中的其中一个元素。
for (String title : bookmarks) {
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
if (program.getTitle().equals(title)) {
if (program.hasEnded()) {
bookmarks.remove(title);//FORBIDDEN !!!
} else {
bookmarkList.add(program);
}
break;
}
}
}使用工作示例更新的 :
List<String> bookmarksToRemoved = new ArrayList<>();
for (String title : bookmarks) {
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
if (program.getTitle().equals(title)) {
if (program.hasEnded()) {
bookmarksToRemoved.add(title);//keep them in a temporary list
} else {
bookmarkList.add(program);
}
break;
}
}
}
bookmarks.removeAll(bookmarksToRemoved);//remove all bookmarks to be removed致以敬意,
罗伊克
发布于 2016-08-22 08:16:30
不能为每个循环删除正在迭代的列表中的项。因此,为了更好的解决方案,请忽略这一点。
https://stackoverflow.com/questions/39073861
复制相似问题