[英]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.