ConcurrentModificationException приложение не запускается
Эмулятор не запускает приложение и выдает вот это: `
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.blum, PID: 12203
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at com.example.blum.Fragments.ChatsFragment$2.onDataChange(ChatsFragment.java:101)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I/Process: Sending signal. PID: 12203 SIG: 9
`
Я не опытный в программировании, подскажите что сделать чтобы решить проблему пожалуйста. Мой код:
package com.example.blum.Fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blum.Adapter.UserAdapter;
import com.example.blum.Model.Chat;
import com.example.blum.Model.User;
import com.example.blum.R;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class ChatsFragment extends Fragment {
private RecyclerView recyclerView;
private UserAdapter userAdapter;
private List<User> mUsers;
FirebaseUser fuser;
DatabaseReference reference;
private List<String> usersList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chats, container, false);
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
fuser = FirebaseAuth.getInstance().getCurrentUser();
usersList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
usersList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Chat chat = snapshot.getValue(Chat.class);
if (chat.getSender().equals(fuser.getUid())) {
usersList.add(chat.getReceiver());
}
if (chat.getReceiver().equals(fuser.getUid())) {
usersList.add(chat.getSender());
}
}
readChats();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
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 : usersList) {
if (user.getId().equals(id)) {
if (mUsers.size() != 0 ) {
for (User userl : mUsers) {
if (!user.getId().equals(userl.getId())) {
mUsers.add(user);
}
}
} else {
mUsers.add(user);
}
}
}
}
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
Ответы (2 шт):
Автор решения: Yakov
→ Ссылка
Ошибка в этом участке кода скорее всего. нельзя модифицировать список, по которому ты делаешь цикл через итератор. Вместо mUsers создай новый список, и добавляй данные в него. после цикла можешь его присвоить обратно исходному, как вариант.
for (User userl : mUsers) {
if (!user.getId().equals(userl.getId())) {
mUsers.add(user);
}
}
Автор решения: BLUM
→ Ссылка
Спасибо за помощь. Оставлю решение проблемы:
for (String id : usersList) {
if (user.getId().equals(id)) {
if (mUsers.size() != 0 ) {
for (User user1 : new ArrayList< User >(mUsers)) {
if (mUsers.stream().noneMatch(u -> user.getId().equals(u.getId()))) {
mUsers.add(user);
}
}
} else {
mUsers.add(user);
}
}
}