java - 用户数组列表中的并发修改异常

标签 java android

我完成了这段代码,向每个与登录用户聊天的用户显示。这段代码给了我一个 ConcurrentModificationException 错误。当我回复消息时会发生这种情况。

我使用数组列表来存储从 firebase 检索的数据。该错误导致代码行“for (User user1 : users) { ”。如何解决这个问题。

 private void readChats() {

        users = new ArrayList<>();

        reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                users.clear();

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

                    // Display each user from the chats
                    for (String id : usersList) {
                        if (user.getId().equals(id)) {
                            if (users.size() != 0) {
                                for (User user1 : users) { // getting error
                                    if (!user.getId().equals(user1.getId())){
                                        users.add(user);
                                    }
                                }
                            } else {
                                users.add(user);
                            }
                        }
                    }
                }

                usersAdapter= new UsersAdapter(getContext(), users);
                recyclerView.setAdapter(usersAdapter);
            }

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

            }
        });


    }

这会给出以下错误消息。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.dasun96.vreyedoctor, PID: 20759
    java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.next(ArrayList.java:860)
        at com.dasun96.vreyedoctor.ChatsFragment$2.onDataChange(ChatsFragment.java:93)
        at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source:13)
        at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
        at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)

最佳答案

你可以试试users = new CopyOnWriteArrayList<>();而不是users = new ArrayList<>();

ArrayLists快速失败,这意味着当您尝试执行非法操作时它们会抛出异常。非法操作的一个示例可能是从 ArrayList 添加/删除同时迭代它(没有迭代器)。

长话短说,使用CopyOnWriteArrayList这样您就不会再有任何头痛了。

关于java - 用户数组列表中的并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409475/

相关文章:

java - 使用字符与字符数组进行初始化

java - Spring 事务 - 需要新的 - 父级回滚

android - 即使操作栏中有空间,按钮也会折叠

java - 使用AppCompatAcitvity时无法获取Context

java - Hazelcast 集群映射配置

java - 为什么会出现此异常 : Exception in thread "main" org. apache.poi.openxml4j.exceptions.NotOfficeXmlFileException

java - 在 Java 中转换泛型类型(例如 T value = (T) inputParam)

android - android 应用程序开头的 java.io.FileNotFoundException : com/google/inject/internal/util/$Finalizer. 类

java - 将字符串转换为日期格式后月份显示不同

android - 如何在 Jetpack Compose 中实现 list multiSelect?