带有自定义ArrayList的java.util.ConcurrentModificationException

时间:2017-01-24 07:51:22

标签: java android arraylist

当然我知道这个错误意味着什么,但我不知道如何删除它。 现在我正在尝试

 private void removeFriendFromList() {
    List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
    for (Friend friend : globalSearchFriends) {
        if (friend.equals(remove)) {
            copy.remove(friend);
        }
    }
}

但这不起作用。 这是我的全球主义者

 private List<Friend> globalSearchFriends = new ArrayList<>();

我正在尝试迭代,但它没有用,或者我做了一件坏事。

此外我需要在这里使用它:我在api中搜索朋友,这就像我在EditText中输入文本然后在我的适配器中看到那个用户,但是这项工作仅适用于少数成员,总是当我搜索“安德鲁”然后我搜索“youko”我得到错误。

private void serachFriend(final String query) {

    etGlobalSearch.addTextChangedListener(new TextWatcherAdapter() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            FindFriend request = new FindFriend();
            request.query = query;
            request.query = s.toString().toLowerCase().trim();
            backend.findFriend(request).enqueue(new Callback<ResponseFindFriend>() {
                @Override
                public void onResponse(Call<ResponseFindFriend> call, Response<ResponseFindFriend> response) {
                    synchronized (globalSearchFriends) {
                        globalSearchFriends.clear();
                        removeFriendFromList();
                        try {
                            if (response == null)
                                throw new Exception();
                            if (!response.isSuccessful())
                                throw new Exception();
                            if (response.body() == null)
                                throw new Exception();
                            if (response.body().results == null)
                                throw new Exception();
                            globalSearchFriends = response.body().results;
                        } catch (Exception e) {
                            Log.d("Blad", "sobie");
                        } finally {
                            gatherResults();
                        }
                    }
                }

                @Override
                public void onFailure(Call<ResponseFindFriend> call, Throwable t) {
                    synchronized (globalSearchFriends) {
                        globalSearchFriends.clear();
                        removeFriendFromList();
                        gatherResults();
                    }
                }
            });
        }
    });
}

private void removeFriendFromList() {
    List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
    for (Friend friend : globalSearchFriends) {
        if (friend.equals(remove)) {
            copy.remove(friend);
        }
    }
}

private void gatherResults() {
    removeFriendFromList();
    for (Friend f : globalSearchFriends)
        globalSearchFriends.add(f);
    findedFriendsAdapter.setFriendList(globalSearchFriends);
}

任何有关的帮助,祝你有愉快的一天! :)

编辑 我在这个案子上得到了错误。

java.util.ConcurrentModificationException
   for (Friend f : globalSearchFriends)
        globalSearchFriends.add(f);
    findedFriendsAdapter.setFriendList(globalSearchFriends);

在日志上我有:

   at java.util.ArrayList$ArrayListIterator.next

3 个答案:

答案 0 :(得分:2)

这听起来很可疑:

globalSearchFriends

您尝试在迭代时将ArrayList的内容添加到自身,ConcurrentModificationException不允许这样做,因此会导致remove。确实ArrayList#iterator()会返回fail-fast iterator,这意味着:

  

如果列表在迭代器之后 结构修改   除了通过迭代器自己的addConcurrentModificationException外,以任何方式创建   方法,迭代器将抛出globalSearchFriends.addAll(globalSearchFriends); // or globalSearchFriends.addAll(new ArrayList<>(globalSearchFriends)); for safety findedFriendsAdapter.setFriendList(globalSearchFriends);

它听起来不像是正常/预期的行为,但如果你真的想要复制列表的内容,只需使用addAll(Collection<? extends E> c)而不是迭代为下一个:

ArrayList

NB: addAll(Collection<? extends E> c)不是线程安全的,因此当且仅当列表未共享或受到保护时,请确保在列表中调用{{1}}显式或内在锁定,否则您将获得不可预测的行为。

答案 1 :(得分:0)

CopyOnWrite Collection怎么样?

META.permissions

输出 list = [0,1,2,3,4,5,6,7,8,9,0,200,400,600,800]

答案 2 :(得分:0)

尝试以下

   private void removeFriendFromList() {
     List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
     Friend targetToRemove = null;
     for (Friend friend : globalSearchFriends) {
       if (friend.equals(remove)) {
         targetToRemove = friend;
       }
     }
     if (targetToRemove != null) {
       copy.remove(targetToRemove);
     }
   }