Я получаю это исключение ConcurrentModificationException от Firebase
Process: com.example.myclass, PID: 9145
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.example.myclass.Fragments.ChatFragment$2.onDataChange(ChatFragment.java:109)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Я уже несколько раз менял код (например, использовал addAll вне l oop et c.) Но я все еще получаю ошибку. Теперь у меня нет идей, что я мог бы изменить, чтобы это исправить. Вот мой текущий код:
private void readChat(){
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);
//display 1 users from chat
for (String id : userlist){
if (user.getId().equals(id)){
if (mUsers.size()!=0){
for (User user1 : mUsers){ <<<<<<<<<<<<<<<<<<<THIS ERRORR
if(!user.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) {
Toast.makeText(getContext(), "database error", Toast.LENGTH_SHORT).show();
}
});
}
Единственная строка, которую я могу себе представить, которая может вызвать проблему, будет:
for (User user1 : mUsers){
if(!user.equals(user1.getId())){
mUsers.add(user);
}
}
И более расширенный фрагмент кода:
publi c, класс ChatFragment extends Fragment {
private RecyclerView recyclerView;
private UserAdapter userAdapter;
private List<User>mUsers;
private FirebaseUser fuser;
private DatabaseReference reference;
private List<String>userlist;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat,container,false);
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
fuser = FirebaseAuth.getInstance().getCurrentUser();
userlist = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userlist.clear();
for (DataSnapshot snapshot :dataSnapshot.getChildren()){
Chat chat = snapshot.getValue(Chat.class);
if(chat.getSender().equals(fuser.getUid())){
userlist.add(chat.getReceiver());
}
if (chat.getReceiver().equals(fuser.getUid())){
userlist.add(chat.getSender());
}
}
readChat();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
private void readChat(){
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);
//display 1 users from chat
for (String id : userlist){
if (user.getId().equals(id)){
if (mUsers.size()!=0){
for (User user1 : mUsers){
if(!user.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) {
Toast.makeText(getContext(), "database error", Toast.LENGTH_SHORT).show();
}
});
}
}