簡體   English   中英

在onPostExecute()中的ArrayList模型上進行For循環

[英]For loop on ArrayList Model inside onPostExecute()

onPostExecute()期間過濾/檢查 ArrayList中的模型項時onPostExecute() ,我遇到異常ConcurrentModificationException,試圖通過"Items"進行訪問/循環

我有一個具有以下inits和onCreateView() init的活動;

//model init
List<TrackingModel> Items;


//onCreateView() {}
Items = new ArrayList<>();

//and prompt async task
new RetrieveFeedTask().execute();

在我通過URL提取JSON並在JSON數據節點上執行了循環之后,在onPostExecute()中的Items循環期間發生了此異常。

//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);

        }
     }
  }
}

我需要通過方法添加到"Items" for循環內的數組嗎?

outsideMethodAddToItems(id, another_string, more_string);

錯誤發生在這里,因為我們在for循環中添加到ArrayList時無法執行.add()。

當您在列表中循環並嘗試在同一循環中修改(刪除/添加)時,會發生ConcurrentModificationException 這是不允許的。

相反,您可以創建另一個List並繼續向其中添加元素。

我當前的解決方案是將一個temp變量(boolean)設置為false,如果項匹配則在循環內將temp boolean設置為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++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM