【问题标题】:java.util.ConcurrentModificationException in android studio?android studio中的java.util.ConcurrentModificationException?
【发布时间】:2019-03-12 10:27:51
【问题描述】:

我想用 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)

我无法修复此错误,请帮助我:

【问题讨论】:

    标签: android firebase arraylist


    【解决方案1】:

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

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

    }

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      如果您使用普通 for 循环而不是增强型 for 循环,您的问题就解决了。

      【讨论】:

        【解决方案3】:
        if (mUsers.size() != 0) {
            for (User user1 : mUsers) {
                if (!user.getId().equals(user1.getId())) {
                    mUsers.add(user);
                }
            }
        }else {
            mUsers.add(user);
        }
        

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

        我怀疑你可能想要这样的东西:

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

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

        您也可以考虑使用Map&lt;String, User&gt;,其中的键是用户的ID。然后你可以使用:

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

        【讨论】:

          【解决方案4】:

          我也面临这个问题。 更好的是,您可以使用以下代码 sn-p 确保 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);
          

          谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-16
            • 1970-01-01
            • 1970-01-01
            • 2012-06-14
            相关资源
            最近更新 更多