Android 集合操作关于Exception in thread "main" java.util.ConcurrentModificationException

开发日程模块,若显示日历日期有日程事件则需要在该日期上标记,在模拟机上测试时,当快速切换月份时导致该错误出现,代码如下:
@Override
        protected void onPostExecute(ArrayList<Schedule> schedules) {
            super.onPostExecute(schedules);
            if (schedules!=null){//此时有数据
                for (Date date:mark_list){
                    //Calendar calendar=Calendar.getInstance();
                    calendar_mark.setTime(date);
                    robot.markCircleImage1(calendar_mark);
                }
            }
        }

该段代码在AsyncTask中异步执行,其中mark_list(ArrayList)为存储需要标记的日期,使用for循环在robot(日历控件)上,挨个标记。当频繁切换月份时,会出现多个线程共同操作mark_list集合的现象,然后出现该问题,后经查询,问题出现的原因及解决办法在以下链接:

http://www.cnblogs.com/frankliiu-java/articles/1759460.html

更改后,快速切换月份,也不会报出此类错误,更改后的代码如下:

@Override
        protected void onPostExecute(ArrayList<Schedule> schedules) {
            super.onPostExecute(schedules);
            if (schedules!=null){//此时有数据
                ArrayList<Date> mark_list_thread=new ArrayList<>();//多线程报错,需将mark_list重新复制
                if (mark_list_thread!=null){
                    mark_list_thread.clear();
                }
                mark_list_thread.addAll(mark_list);
                for (Date date:mark_list_thread){
                    //Calendar calendar=Calendar.getInstance();
                    calendar_mark.setTime(date);
                    robot.markCircleImage1(calendar_mark);
                }
                mark_list_thread.removeAll(mark_list);//对集合操作完成之后,在将数据清空,以防占用大量内存
            }

        }


猜你喜欢

转载自blog.csdn.net/androidforwell/article/details/54630393
今日推荐