У меня есть следующий наблюдатель для отслеживания изменения таблицы, когда изменение запускается, он вызывает api для синхронизации информации о пользователе. Эта логика выполняет свою работу, но бывает, что OnChange вызывает несколько раз с одним и тем же набором изменений, поэтому он может выполнять несколько вызовов api, которые не нужны. Я добавил глобальный список для захвата элементов inProcess, но этот список не синхронизируется между каждым вызовом OnChange. Вот код:
userViewModel.getAllNewUsers().observe(getActivity(), new Observer<List<User>>() {
@Override
public void onChanged(@Nullable List<User> users) {
Log.d(logTag, "Observeed " + users.size() + " new users, calling updateNewUsers");
List<User> userSyncList = new ArrayList<>();
Log.d(logTag, "userProcessingList size " + userProcessingList.size());
Log.d(logTag, "users size " + users.size());
if (userProcessingList.size() == 0 && users.size() > 0) {
Log.d(logTag, "Nothing is processing, let's sync all users");
userProcessingList.addAll(users);
userSyncList.addAll(users);
Log.d(logTag, "new userProcessingList size " + userProcessingList.size());
Log.d(logTag, "userSyncList " + userProcessingList.toString());
} else if (users.size() > 0) {
for (User user : users) {
if (!userProcessingList.contains(user)) {
Log.d(logTag, "userProcessingList is " + userProcessingList.toString());
userProcessingList.add(user);
userSyncList.add(user);
} else {
Log.d(logTag, "User already in syncing process, ignoring...");
}
}
}
if (userSyncList.size() > 0) {
updateNewUsers(userSyncList);
}
if (users.size() == 0 && userProcessingList.size() > 0) {
Log.d(logTag, "all users are in sync, let empty out the processing list");
userProcessingList.clear();
}
Log.d(logTag, "at the end userProcessingList size " + userProcessingList.size());
}
});
вот журнал
09-16 23:35:34.040 5956-5956: Observeed 0 new users, calling updateNewUsers
09-16 23:35:34.040 5956-5956: userProcessingList size 0
09-16 23:35:34.040 5956-5956: users size 0
09-16 23:35:34.040 5956-5956: at the end userProcessingList size 0
09-16 23:35:34.047 5956-5956: Observeed 2 new users, calling updateNewUsers
09-16 23:35:34.047 5956-5956: userProcessingList size 0
09-16 23:35:34.047 5956-5956: users size 2
09-16 23:35:34.048 5956-5956: Nothing is processing, let's sync all users
09-16 23:35:34.048 5956-5956: new userProcessingList size 2 <-- THE LIST SIZE IS NOW 2
09-16 23:35:34.048 5956-5956: in updateViewModelForNewUsers
09-16 23:35:34.048 5956-5956: newUserCounter is -1
09-16 23:35:34.048 5956-5956: isVisible is true
09-16 23:35:34.050 5956-5956: at the end userProcessingList size 2 <-- THE LIST IS STILL 2
09-16 23:35:34.050 5956-5956: Observeed 2 new users, calling updateNewUsers
09-16 23:35:34.050 5956-5956: userProcessingList size 0 <-- LIST SIZE IS NOW 0 WHILE IT SHOULD BE 2
09-16 23:35:34.050 5956-5956: users size 2
09-16 23:35:34.050 5956-5956: Nothing is processing, let's sync all users
09-16 23:35:34.050 5956-5956: new userProcessingList size 2
09-16 23:35:34.050 5956-5956: in updateViewModelForNewUsers
09-16 23:35:34.050 5956-5956: newUserCounter is 0
09-16 23:35:34.050 5956-5956: isVisible is true
The list size will eventually be 2 after couple OnChange is called.
Я пробую CopyOnWriteArrayList и collect.synchronizedList с Synchorized (userProcessingList) {}, и оба они не помогают. Пожалуйста, порекомендуйте!
userProcessingLIst - это новая переменная, которую я только что добавил, никакое другое место не изменяет ее ... Попытайтесь опубликовать вам код, но он не позволит мне, так как он слишком длинный для комментариев
Похоже, что если я определю userProcessingList как глобальную переменную вместо того, чтобы определять его в этом фрагменте, это сработает ... Вы знаете, почему? К вашему сведению, приведенный выше код находится в функции onViewCreated. Это что-то вроде: открытый класс ListUsers расширяет фрагмент, реализует RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {частный список <User> userProcessingList = new ArrayList <> (); public void onViewCreated (View view, @Nullable Bundle savedInstanceState) {# Здесь идет код сверху}




может быть вы где-то очищаете
userProcessingList. Опубликуйте свой код методаupdateNewUsers.