Android从嵌套的Arraylist中删除项目给出错误并发修改异常

时间:2015-08-14 04:39:22

标签: android exception arraylist nested

我是android新手。我想从Arraylist中的Arraylist中删除项目。但当我删除特定项目时,它给我一个错误'ConcurrentModificationException'。那么我该如何处理它或者如果有任何其他可能的解决方案那么请建议我解决这个错误。我发布了我的代码。

我的代码如下,

for (Item cart : CartItems) {
                if (cart.getIsSub_item() == false) {
                    for (Item list : sclList) {
                        CartItems.remove(list);
                    }
                } else {
                    for (Item i : sclList.get(sub_position).getSub_items()) {
                        if (CartItems.contains(i)) {
                            CartItems.remove(i);
                        }
                    }
                }
            }

这是我的logcat ::

java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.util.ConcurrentModificationException
            at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
            at com.njoyful.userapp.Fragments.OrderFragment$RemoveSubItem.doInBackground(OrderFragment.java:800)
            at com.njoyful.userapp.Fragments.OrderFragment$RemoveSubItem.doInBackground(OrderFragment.java:774)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)

在第一行,我收到错误。谢谢。

2 个答案:

答案 0 :(得分:0)

ConcurrentModificationException

  

Collection是时抛出ConcurrentModificationException   已修改并且Collection上的现有迭代器用于修改   收藏品也是如此。

从注释中可以看出,您的ArrayList是通过UI从一个线程中的另一个方法访问的,同时在另一个线程中从中删除项目。

那么,为什么不将两个访问器包装在

synchronized(array_list_name)
{
    // UI access code or item removal code
}

注意如果删除项目需要很长时间,这可能会导致UI滞后。如果是这种情况,请考虑列出要删除的所有项目索引,并在迭代整个列表后在紧密同步循环中删除它们。

另一方面,如果修改很少,请尝试使用java.util.concurrent.CopyOnWriteArrayList而不是ArrayList。

答案 1 :(得分:0)

而是使用Iterator从ArrayList中删除项目。

                Iterator<Items> iter = CartItems.iterator();

                while(iter.hasNext()){

                    if("your condition")
                    {
                        iter.remove();
                    }
                    else{
                         "Your code"}
                }