代码之家  ›  专栏  ›  技术社区  ›  BENN1TH

onPostExecute()内ArrayList模型上的For循环

  •  0
  • BENN1TH  · 技术社区  · 6 年前

    我有个问题 筛选/检查 我的模型项位于 ArrayList 在期间 onPostExecute() 我有个例外 ConcurrentModificationException 正在尝试 访问/循环 通过 "Items"

    我有一个活动,它具有以下初始化和 onCreateView() 初始化;

    //model init
    List<TrackingModel> Items;
    
    
    //onCreateView() {}
    Items = new ArrayList<>();
    
    //and prompt async task
    new RetrieveFeedTask().execute();
    

    此异常发生在内部的Items循环期间 onPostExecute() 在我拿到 JSON 通过 URL 然后在 JSON 数据节点。

    //For Loop on JSON Response in onPostExecute()
    JSONArray data = obj.getJSONArray("response");
    for (int i = 0; i < data.length(); i++) {
    
       String id = data.getJSONObject(i).optString("id");
    
       //in here I add to Items, first checking if Items.isEmpty()
       if(Items.isEmpty()){
    
         //add to Model/Items.ArrayList
         //works fine
    
         TrackingModel reg = new TrackingModel();                                                            
         reg.setId(id);
         Items.add(reg);
    
       }else{
    
         //check getJSONObject() item already in Items.ArrayList to avoid duplications
    
         for (TrackingModel Item : Items) {
    
            if(Item.id().toString().contains(id)){
    
                 //already in ArrayList, skip adding
    
            }else{
    
                //error occurs here as we are adding to ArrayList
                //cant do .add() when in for loop ....
    
                //Do I add to the array outside the For Loop via method?
                //outsideMethodAddToItems(id, another_string, more_string);
    
                TrackingModel reg = new TrackingModel();                                                            
                reg.setId(id);
                Items.add(reg);
    
            }
         }
      }
    }
    

    是否需要添加到 “项目” 通过方法进行循环?

    outsideMethodAddToItems(id, another_string, more_string);

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ravi    6 年前

    此处发生错误,因为我们正在添加ArrayList cant do。加入时添加() for循环。。。。

    ConcurrentModificationException 在循环列表并尝试在同一循环中修改(删除/添加)列表时发生。这是不允许的。

    相反,您可以创建另一个 List 并不断添加您的元素。

        2
  •  0
  •   BENN1TH    6 年前

    当前的解决方案是将一个临时变量(布尔值)设置为false,如果一个项匹配,则在循环内将临时布尔值设置为true。然后我检查temp布尔值是否设置为true,如果不是,我可以运行add();

     //while inside 
     JSONArray data = obj.getJSONArray("response");
     for (int i = 0; i < data.length(); i++) {
    
        //temp boolean
        Boolean isFound = false;
    
        for (TrackingModel Item : Items) {
    
          if(Item.id().toString().contains(id)){
    
             //already in ArrayList, skip adding
             //set temp boolean as true as we found a match
             isFound = true;
    
          }
    
    
       }
    
       //now we check temp boolean isFound is false, so we can run add();
       if(!isFound ){
    
            TrackingModel reg = new TrackingModel();                                                            
            reg.setId(id);
            Items.add(reg);
    
       }
    
    }
    //end of for (int i = 0; i < data.length(); i++)