2012-11-23 35 views
12

Tôi có đoạn code folloing trong ứng dụng Android của tôi:java.util.ConcurrentModificationException android sau khi loại bỏ các yếu tố từ danh sách mảng

/** 
* callback executed after fetching the data. 
*/ 
public void OnPointsFetch(ArrayList<Shop> result) { 

    toggleLoader(false); 

    this.shops = result; 

    if(activeFilter == Constants.POINTS_FILTER_AVAILABLE){ 
     for(Shop s : result){ 
      if(s.getClientPoints().getPointsAvailable() == 0){ 
       this.shops.remove(s); 
      } 
     } 
    } 
    else{ 
     for(Shop s : result){ 
      if(s.getClientPoints().getPointsSpent() == 0){ 
       this.shops.remove(s); 
      } 
     } 
    } 


    ptsListAdapter.setCollection(this.shops); 
    ptsListAdapter.setFilter(this.activeFilter); 

} 

Phương pháp này được gọi là trên kết quả của một nhiệm vụ async. Tôi cần phải loại bỏ một số yếu tố của bộ sưu tập trước khi chuyển đến bộ điều hợp danh sách.

11-23 17:39:59.760: E/AndroidRuntime(19777): java.util.ConcurrentModificationException 
11-23 17:39:59.760: E/AndroidRuntime(19777): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 

Trả lời

34

Bạn không thể xóa các mục khỏi danh sách trong khi lặp qua nó. Bạn cần phải sử dụng một iterator và phương pháp loại bỏ nó:

for(Iterator<Shop> it = result.iterator(); it.hasNext();) { 
    Shop s = it.next(); 
    if(s.getClientPoints().getPointsSpent() == 0) { 
     it.remove(); 
    } 
} 
+0

Tuyệt vời. nó hoạt động !. – brpaz

0

Bạn nhận được lỗi này thường khi

  1. bạn chỉnh sửa bộ sưu tập trực tiếp trong khi nó đang lặp lại trong bộ sưu tập

    hoặc thậm chí tồi tệ hơn khi

  2. một chủ đề sửa đổi bộ sưu tập, trong khi một chủ đề khác lặp lại nó.

+1

Ông sẽ nhận được rằng ngoại lệ với một sợi quá (ông thực sự có lẽ chỉ chạy một sợi). – assylias

+0

Có chính xác, lặp lại và sửa đổi nguyên nhân quá. – AlexWien

0

Không chắc chắn câu trả lời được chấp nhận có hoạt động hay không, vì nội bộ nó sẽ cố gắng sửa đổi lại cùng một danh sách. Một cách tiếp cận rõ ràng hơn là duy trì danh sách 'xóa' và tiếp tục thêm các phần tử vào danh sách đó trong vòng lặp. Khi chúng tôi đã sẵn sàng với danh sách xóa, chúng có thể được xóa sau vòng lặp. Điều này sẽ làm việc trong mọi trường hợp mà chúng ta không cần phần tử đã xóa được tái xử lý. Nếu có, thì danh sách xóa hiện tại có thể được kiểm tra sự hiện diện của phần tử đó.

List<String> list = new ArrayList<String>(); 
    List<String> listRemove = new ArrayList<String>(); 

    list.add("1"); 
    list.add("2"); 
    list.add("3"); 
    list.add("4"); 
    list.add("5"); 
    list.add("6"); 
    list.add("7"); 
    list.add("8"); 

    System.out.println("list : " + list); 

    for (String i : list) { 
     if (i.equals("2")) { 
      listRemove.add(i); 
     } 
    } 
    list.removeAll(listRemove); 
    System.out.println("updated list: " + list); 
Các vấn đề liên quan