Android Studio中的java.util.ConcurrentModificationException?

时间:2019-03-12 10:27:52

标签: android firebase arraylist

我想用android studio创建一个聊天应用,当我想在应用中显示用户时,应用崩溃了,代码如下:

private void readChats()
{
    mUsers = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("Users");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
        {
            mUsers.clear();

            for (DataSnapshot snapshot : dataSnapshot.getChildren())
            {
                User user = snapshot.getValue(User.class);

                for (String id : userList){
                    assert user != null;
                    if (user.getId().equals(id)) {
                        if (mUsers.size() != 0) {
                            for (User user1 : mUsers) {
                                if (!user.getId().equals(user1.getId())) {
                                    mUsers.add(user);
                                }
                            }
                        }else {
                            mUsers.add(user);
                        }
                    }
                }
            }
            userAdapter = new UserAdapter(getContext(), mUsers);
            recyclerView.setAdapter(userAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError)
        {

        }
    });
}

我的错误在下面:

    java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at com.example.mahdi.chatapp.Fragments.ChatsFragment$2.onDataChange(ChatsFragment.java:101)

以及此行中的错误:

for (User user1 : mUsers)

我无法解决此错误,请帮助我

4 个答案:

答案 0 :(得分:1)

您不能循环更改此列表(“ mUsers”),因为循环使用计数项作为限制。 如果您使temp变量,或使用此代码:

for (User user : new ArrayList< User >(mUsers)) {
  if (!user.getId().equals(user1.getId())) {
 }

}

我希望对您有帮助

答案 1 :(得分:1)

如果您使用普通的for循环而不是增强的for循环,则可以解决问题。

答案 2 :(得分:1)

if (mUsers.size() != 0) {
    for (User user1 : mUsers) {
        if (!user.getId().equals(user1.getId())) {
            mUsers.add(user);
        }
    }
}else {
    mUsers.add(user);
}

除了ConcurrentModificationException(来自mUsers.add(user)循环内的mUsers)之外,我认为这不是您想要的逻辑。这会将user添加到列表N次,其中N是列表中具有不同ID的用户数。

我怀疑您可能想要以下内容:

if (mUsers.stream().noneMatch(u -> user.getId().equals(u.getId())) {
  mUsers.add(user);
}

如果没有其他具有该ID的用户,则添加一次user

您还可以考虑使用Map<String, User>,其中密钥是用户的ID。然后,您可以使用:

map.computeIfAbsent(user.getId(), k -> user);

答案 3 :(得分:0)

我太面对这个问题了。 最好使用下面的代码片段,以确保在ChatFragment中仅添加了一个用户。

        reference=FirebaseDatabase.getInstance().getReference("Users");

        reference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();

                for(DataSnapshot snapshot:dataSnapshot.getChildren()){


                    User user=snapshot.getValue(User.class);

                    //Display 1 user from chat
                    for (String id:usersList){
                        assert user != null;
                        if(user.getId().equals(id)){
                            if(mUsers.size()!=0){
                                int flag=0;
                               for(User u : mUsers) {
                                   if (user.getId().equals(u.getId())) {
                                       flag = 1;
                                       break;
                                   }
                               }
                               if(flag==0)
                                   mUsers.add(user);
                            }else{

                                mUsers.add(user);
                            }
                        }
                    }
                }

                userAdapter=new UserAdapter(getContext(),mUsers,true);
                recyclerView.setAdapter(userAdapter);

谢谢