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);//对集合操作完成之后,在将数据清空,以防占用大量内存
            }

        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值