Android 同时访问列表

Android 同时访问列表,android,concurrency,Android,Concurrency,在我的项目中,我需要一些能够对我的服务器进行分组调用的东西,因为有些“批处理”路由接受一个id列表,而不是一个简单的id 我的想法是建造一个池子,每隔一段时间就清空一次 因此,我创建了这个抽象存储库(不确定它的名称是否正确): 我的例外: Java.util.ConcurrentModificationException at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) at com.m360.androi

在我的项目中,我需要一些能够对我的服务器进行分组调用的东西,因为有些“批处理”路由接受一个id列表,而不是一个简单的id

我的想法是建造一个池子,每隔一段时间就清空一次

因此,我创建了这个
抽象存储库
(不确定它的名称是否正确):

我的例外:

Java.util.ConcurrentModificationException
  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
  at com.m360.android.domain_layer.interactors.MemberInteractor.constructPagerMemberUsers(MemberInteractor.java:116)
  at com.m360.android.domain_layer.interactors.MemberInteractor.access$000(MemberInteractor.java:29)
  at com.m360.android.domain_layer.interactors.MemberInteractor$2$1.fetched(MemberInteractor.java:64)
  at com.m360.android.datalayer.repositories.AbstractRepository$2.run(AbstractRepository.java:99)
如果MemberInteractor仅包含静态方法,则崩溃将使用以下2种方式显示:

public static void getGroupUsers(String id, final Context c, final ErrorDisplayerInterface i, final MemberInteractorCallback callback) {
    GroupRepository.getInstance(c).getCache(id, new AbstractRepository.FetchedInterface<Group>() {
        @Override
        public void fetched(Group item) {
            UserRepository userRepositoryNew = UserRepository.getInstance(c);
            userRepositoryNew.getCache(new ArrayList<>(item.getUsers()), new AbstractRepository.ListFetchedInterface<UserCache>() {
                @Override
                public void fetched(List<UserCache> items) {
                    callback.onFinish(constructPagerMemberUsers(items));
                }
            });
        }
    });
}


private static List<PagerMemberUser> constructPagerMemberUsers(final List<UserCache> items) {

    final List<PagerMemberUser> users = new ArrayList<>();
    for (UserCache item : items) {
        users.add(new PagerMemberUser(item));
    }
    return users;
}
publicstaticvoid getGroupUsers(字符串id、最终上下文c、最终错误显示接口i、最终成员交互或回调){
GroupRepository.getInstance(c).getCache(id,new AbstractRepository.FetchedInterface()){
@凌驾
已获取公共作废(组项){
UserRepository userRepositoryNew=UserRepository.getInstance(c);
userRepositoryNew.getCache(新的ArrayList(item.getUsers()),新的AbstractRepository.ListFetchedInterface(){
@凌驾
已获取公共作废(列表项){
onFinish(constructPagerMemberUsers(items));
}
});
}
});
}
私有静态列表构造函数PagerMemberUsers(最终列表项){
最终列表用户=新的ArrayList();
用于(UserCache项:项){
添加(新的PagerMemberUser(项));
}
返回用户;
}
很抱歉,有很多代码,但我认为所有这些都与我的问题有关

那么那里发生了什么?我看不出有什么问题。

您可以通过for-each循环更改迭代的列表

因此,在这种情况下,简单的解决方法是在迭代列表之前,将foreach更改为创建列表的副本:

 for (UserCache item : new LinkedList<UserCache>(items)) {
    users.add(new PagerMemberUser(item));
}
for(用户缓存项:新链接列表(项)){
添加(新的PagerMemberUser(项));
}
您可以通过for-each循环更改迭代的列表

因此,在这种情况下,简单的解决方法是在迭代列表之前,将foreach更改为创建列表的副本:

 for (UserCache item : new LinkedList<UserCache>(items)) {
    users.add(new PagerMemberUser(item));
}
for(用户缓存项:新链接列表(项)){
添加(新的PagerMemberUser(项));
}

将该方法放入同步块中

将该方法放入同步块中

嗯,您的修复确实有效,但我更愿意同步修改方法。但是我不知道它会是什么。哼,你的修复确实有效,但我更愿意同步修改方法。但我不知道会是什么。
 for (UserCache item : new LinkedList<UserCache>(items)) {
    users.add(new PagerMemberUser(item));
}