开发日程模块,若显示日历日期有日程事件则需要在该日期上标记,在模拟机上测试时,当快速切换月份时导致该错误出现,代码如下:
@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);//对集合操作完成之后,在将数据清空,以防占用大量内存
}
}