Android arrayList не сохраняет значение при вызове onChange

У меня есть следующий наблюдатель для отслеживания изменения таблицы, когда изменение запускается, он вызывает 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. Опубликуйте свой код метода updateNewUsers.

Abu Yousuf 17.09.2018 07:32

userProcessingLIst - это новая переменная, которую я только что добавил, никакое другое место не изменяет ее ... Попытайтесь опубликовать вам код, но он не позволит мне, так как он слишком длинный для комментариев

spiderloop 17.09.2018 08:34

Похоже, что если я определю userProcessingList как глобальную переменную вместо того, чтобы определять его в этом фрагменте, это сработает ... Вы знаете, почему? К вашему сведению, приведенный выше код находится в функции onViewCreated. Это что-то вроде: открытый класс ListUsers расширяет фрагмент, реализует RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {частный список <User> userProcessingList = new ArrayList <> (); public void onViewCreated (View view, @Nullable Bundle savedInstanceState) {# Здесь идет код сверху}

spiderloop 18.09.2018 01:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
61
0

Другие вопросы по теме