调用onChange时,Android arrayList不保留值

时间:2018-09-17 04:57:05

标签: java android arraylist android-livedata

我有以下观察者来监视表更改,当触发更改时,它将调用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,并使用Synchorized(userProcessingList){}收集collect.synchronizedList,但两者都无济于事。请指教!

0 个答案:

没有答案