私はsuggestedFriends
とallSuggestedFriends
の2つのリストを持っています。Android:ConcurrentModificationException継続
イテレータを使用して最初のリストを実行し、このリストからアイテムを削除します。途中でアイテムがまだ残っている場合、アイテムは2番目のリストから削除する必要があります。 2番目のリストから項目を削除するために、2番目のイテレータ(SafeRemoveメソッド内)を使用します。
問題:項目を削除するためにイテレータを使用していますが、if (allSuggestedFriends.size() > 0) {
という行にConcurrentModificationExceptionが表示されることがあります。
イテレータを使用してサイズを問い合わせる必要がありますか?更新
private void SafeRemove(List<User> list, User friend) {
Iterator<User> iter = list.iterator();
while (iter.hasNext()) {
User user = iter.next();
if (user.userId == friend.userId)
iter.remove();
}
}
:
を追加する解決策になる私は、第二のイテレータを使用して(?!)
synchronized (suggestedFriends) {
for (final Iterator<User> suggestedFriendsIterator = suggestedFriends.iterator(); suggestedFriendsIterator.hasNext();) {
User friend = suggestedFriendsIterator.next();
if (friend.userId == request.getUserId()) {
final int index = suggestedFriends.indexOf(friend);
if (status) {
((FragmentActivityExt) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if(suggestedFriends.size() > 0) {
suggestedFriendsIterator.remove();
}
notifyDataSetChanged();
if (allSuggestedFriends.size() > 0) {
suggestedFriends.add(2, allSuggestedFriends.get(0));
SafeRemove(allSuggestedFriends, allSuggestedFriends.get(0));
notifyDataSetChanged();
}
if (suggestedFriends.size() == 1) {
// FIXME workaround to fix list height as wrap_content is not supported by RecyclerView at the moment
//set to fit 1 element
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mListView.getLayoutParams();
params.height = EndoUtility.dpToPx(context, 70);
mListView.setLayoutParams(params);
}
if (suggestedFriends.size() == 0) {
EventBus.getDefault().post(new NoMoreSuggestedFriendsEvent());
}
}
});
} else {
if (mListView != null) {
((FragmentActivityExt) context).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, R.string.networkProblemToast, Toast.LENGTH_LONG).show();
((SuggestedFriendView) mListView.getChildAt(index)).reset();
}
});
}
}
break;
}
}
}
にそれが可能だSafeRemove方法を考えていませんSafeRemove(allSuggestedFriends, allSuggestedFriends.get(0));
行の周りに?次のようになります。
...
synchronized (allSuggestedFriends) {
SafeRemove(allSuggestedFriends, allSuggestedFriends.get(0));
}
...
以上、SafeRemoveメソッドの内部では?このように:
private void SafeRemove(List<User> list, User friend) {
synchronized (list) {
Iterator<User> iter = list.iterator();
while (iter.hasNext()) {
User user = iter.next();
if (user.userId == friend.userId)
iter.remove();
}
}
}
可能な複製(http://stackoverflow.com/questions/6866238/concurrent-modification-exception-adding-to-an-arraylist) –
できるすべてのコメント私の更新? – Ambran